django的生命周期流程图

中间件位于web服务端与url路由层之间

中间件的响应流程:当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。

生命周期

中间件的五个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 导包
from django.utils.deprecation import MiddlewareMixin #中间件

class My_MiddlewareMixin(MiddlewareMixin):
# 请求之前
def process_request(self, request):
pass

# 视图渲染之前
def process_view(self, request, view_func, view_args, view_kwargs):
pass

# 该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法
def process_template_response(self, request, response):
pass

def process_exception(self, request, exception):
pass

# 返回之前
def process_response(self, request, response):
# 注意:response需要使用return返回,不然报错
return response

process_view的参数

1
2
3
4
5
6
7
8
# 该方法有四个参数
# request是HttpRequest对象。
# view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
# view_args是将传递给视图的位置参数的列表(无名分组分过来的值).
# view_kwargs是将传递给视图的关键字参数的字典(有名分组分过来的值)。 view_args和view_kwargs都不包含第一个视图参数(request)。
# Django会在调用视图函数之前调用process_view方法。
def process_view(self, request, view_func, view_args, view_kwargs):
pass

process_response错误:

1
2
3
4
5
6
 if response.get('X-Frame-Options') is not None:
AttributeError: 'NoneType' object has no attribute 'get'
# 原因:就是没有返回response
# 解决
def process_response(self, request, response):
return response

定义中间件之后在settings中注册中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware', #这里是新增的中间件
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
#加载自定义中间件 文件夹名.文件名.类名
# 'myapp.views.MyMiddleware',
'myapp.md_user.My_MiddlewareMixin',
]

使用django原生Httpresponse返回Json格式

1
2
3
4
5
6
7
8
9
def process_request(self, request):
# 第一种:
# content_type="application/json"声明json类型
# indent=4四个空格,美观
# ensure_ascii=False不使用ascii编码,输出中文
return Httpresponse(json.dumps({'message':'您的秘钥无权限'},indent=4,ensure_ascii=False),content_type="application/json")
# 第二种:
# json_dumps_params=dict
return JsonResponse({'message':'您的秘钥无权限'},safe=False,json_dumps_params=({'ensure_ascii':False,'indent':4}))

因为每次请求都要走中间件,所以针对路由判断是否走中间件

1
2
3
4
def process_request(self, request):
# 获取路由
if request.path_info.startswith('/userinfo/'):
return Httpresponse(json.dumps({'message':'您的秘钥无权限'},indent=4,ensure_ascii=False),content_type="application/json")

评论





载入天数...载入时分秒...

Blog content follows the Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) License

Use WZH as theme, total visits times