相当于django的门户,只要是全局相关的功能,都可以考虑使用中间件来完成:
在之前,我们通过装饰器的方式来对视图函数进行验证,但这样还是显得繁琐,我们可以通过中间件来实现。
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
当请求到达中间件的时候,会从上到下依次经过上面的七个中间件,这七个默认中间件会依次对请求进行处理,如果所有的中间件对请求处理完毕,没有问题的时候,这时请求才可以到达路由与视图层。如果有问题,请求就不会到达路由和视图层。
当请求渲染完毕,响应需要返回给browser客户端,此时响应会依次从下到上经过上面的七个中间件。
可以查看django默认的中间件,需要先进行导入:
from django.middleware.security import SecurityMiddleware # 点SecurityMiddleware查看
# 源码部分代码
class SessionMiddleware(MiddlewareMixin):
def process_request(self, request):
def process_response(self, request, response):
class CsrfViewMiddleware(MiddlewareMixin):
def process_request(self, request):
def process_view(self, request, callback, callback_args, callback_kwargs):
def process_response(self, request, response):
class AuthenticationMiddleware(MiddlewareMixin):
def process_request(self, request):
# 可以发现都是继承了MiddlewareMixin类,类中的方法名也有相同的
django允许用户自定义中间件,并暴露给用户五个可以自定义的方法
用户可以根据自己的需求自定义中间件
1、需要掌握的
2、需要了解的
process_view
process_template_reponse
视图函数返回的对象中必须要有render属性对应的render方法
# 视图函数中必须要这样写,否则触发
def index(request):
print('我是视图函数index')
def render():
return HttpResponse("你好啊 我是index里面的render函数")
obj = HttpResponse("index")
obj.render = render
return obj
process_exception
我们观察django默认的中间件,发现它们都继承了MiddlewareMixin类,因此,我们可以通过类似的方式,定义我们自己的中间件。
中间件属于独立的功能,因此我们需要新建一个文件夹,用来放我们自定义的中间件,例如:mymiddleware
,在文件夹下新建mymddle.py
的文件,在文件中书写我们自定义的中间件。
from django.utils.deprecation import MiddlewareMixin
class Mymd1(MiddlewareMixin):
def process_request(self, request):
print('这里的代码会在视图函数之前执行')
return HttpResponse('你好') # 这里一旦有return那“请求”就不会走到路由层,而是直接返回给浏览器browser。
def process_response(self, request, response):
print('pass')
return HttpResponse('你好') # 如果这里返回httpresponse对象,会将返回给用户浏览器的内容替换成你自己的
class Mymd2(MiddlewareMixin):
def process_request(self, request):
print('这里的代码会在视图函数之前执行')
def process_response(self, request, response):
print('pass')
return response # 这里的response必须要返回
def process_view(self, request, view_func, *args, **kwargs):
print(view_func, aegs, kwargs)
def process_template_response(self, request, response):
return response
def process_exception(self, request, exception):
print(exception) # 错误信息
之后需要在settings.py中注册我们的中间件:
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'mymiddleware.mymddle.Mymd1',
'mymiddleware.mymddle.Mymd2',
]
中间件是在特定的点触发,信号量可以在许多个地方触发。
原文:https://www.cnblogs.com/cnhyk/p/12274307.html