带参数的路由
reverse 接收 url 中的 name 作为第一个参数,我们在代码中就可以通过 reverse() 来获取对应的网址(这个网址可以用来跳转,也可以用来计算相关页面的地址),只要对应的 url 的name不改,就不用改代码中的网址。
在网页模板中也是一样,可以很方便的使用。
不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
例如:
<a href="{% url 'add2' 4 5 %}">link</a>
自己来写一个跳转方法:
def old_add2_redirect(request, a, b):
return HttpResponseRedirect(
reverse('add2', args=(a, b))
)
urls.py中:
url(r'^add/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
固定位置传参
urls.py
url(r'^args/(\d+)/(\d+)/(\d+)/', views.args),
views.py
def args(request, year, month, day):
if request.method == 'GET':
s = '%s年%s月%s日' % (year, month, day)
return HttpResponse(s)
关键字传参
urls.py
url(r'^kargs/(?P<yaer>\d+)/(?P<month>\d+)/(?P<day>\d+)/', views.kargs),
views.py
def kargs(request, day, month, year):
if request.method == 'GET':
s = '%s年%s月%s日' % (year, month, day)
return HttpResponse(s)
富文本编辑器
1.引入kindeditor富文本编辑器,放在static文件夹下
配置settings.py 文件
STATIC_URL = '/static/'
# 配置static的路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
MEDIA_URL = '/media/'
# 配置media的路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- 页面中加载富文本编辑器,引入js,实例化富文本输入框
{% extends 'base.html' %}
{% block title %}
文章编辑页面
{% endblock %}
{% block Js %}
{% load static %}
<script type="text/javascript" src="{% static 'kindeditor/kindeditor-all.js' %}"></script>
<script type="text/javascript" src="{% static 'kindeditor/lang/zh-CN.js' %}"></script>
<script type="text/javascript">
KindEditor.ready(function(K) {
window.editor = K.create('#editor_id',{
uploadJson:'/util/upload/kindeditor'
});
});
</script>
{% endblock %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ msg }}
标题:<input type="text" name="title">
内容:<textarea id="editor_id" name="content"></textarea>
<p><input type="submit" value="提交"></p>
</form>
{% endblock %}
过滤器
safe 渲染标签样式
{% block content %}
{{ content_h2 | safe }}<br>
{# 标题化 #}
{% for name in names %}
{{ name | title }}
{% endfor %}
<br>
{# 首字母大写 #}
{% for name in names %}
{{ name | capfirst }}
{% endfor %}
<br>
{# 计算长度 #}
{% for name in names %}
{{ name | length }}
{{ name | first}}
{{ name | last }}
{% endfor %}
{% endblock %}
日志
日志logging模块
组成
Loggers
Handlers
Filters
Formatters
loggers:
Python 定义以下几种日志级别:
DEBUG:用于调试目的的底层系统信息
INFO:普通的系统信息
WARNING:表示出现一个较小的问题。
ERROR:表示出现一个较大的问题。
CRITICAL:表示出现一个致命的问题。
日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
handler:
Handler 决定如何处理logger 中的每条消息。它表示一个特定的日志行为。
Filters
Filter 用于对从logger 传递给handler 的日志记录进行额外的控制。
Formatters
Formatter 表示文本的格式。Fomatter 通常由包含日志记录属性的Python 格式字符串组成
formatter格式:

配置日志
配置settings文件
1.文件夹地址
# 日志文件夹的路径
LOG_PATH = os.path.join(BASE_DIR, 'logs')
# 如果日志文件夹地址不存在,则自动创建
if not LOG_PATH:
os.mkdir(LOG_PATH)
2. 定义LOGGING中的信息,比如loggers,formatters,handlers等
# 配置日志
LOGGING = {
# 必须设置为1
'version': 1,
# 禁止日志
'disable_existing_loggers': False,
# 格式化组件
'formatters': {
'default': {
'format': '%(message)s'
}
},
# logger接受日志
'loggers': {
'': {
'handlers': ['console'],
'level': 'INFO'
}
},
# handlers处理日志
'handlers': {
'console': {
'level': 'INFO',
'filename': '%s/day08log.log' % LOG_PATH,
'formatter': 'default',
'class': 'logging.handlers.RotatingFileHandler',
'maxBytes': 5 * 1024 * 1024,
}
}
}
使用logging打印日志
1.在程序中可以使用logging获取日志对象,然后进行日志打印
import logging
# 获取logger,logger用于接收日志信息,并且丢给handlers进行处理
logger = logging.getLogger(__name__)
# logger接收日志信息的几个方法,如下:
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()
2.定义日志处理的中间件,进行日志的打印处理
定义日志中间件logMiddleware.py文件,定义LoggingMiddleware类,该类继承MiddlewareMixin,并重构process_request和proccess_response方法:
import time
import logging
from django.utils.deprecation import MiddlewareMixin
# 获取log
log = logging.getLogger(__name__)
class LogMiddleware(MiddlewareMixin):
def process_request(self, request):
# 绑定在request上一个属性,表示访问的时间
request.init_time = time.time()
def process_response(self, request, response):
# 请求URL耗时时间
count_time = time.time() - request.init_time
# 响应状态码
code = response.status_code
# 请求地址
path = request.path
# 请求方法
method = request.method
# 响应内容
content = response.content
# 需要打印的日志信息
log_str = '%s %s %s %s %s' % (path, method, code, count_time, content)
# 交给logger处理日志
log.info(log_str)
return response
网友评论