Django自带的中间件
中间件执行流程
自定义中间件
Middle.py
class Middle1(MiddlewareMixin):
def process_request(self, request):
print("中间件request")
def process_response(self, request, response):
print('中间件response')
return response
#常用的方法
class Middle(MiddlewareMixin):
def process_request(self,request):
pass
def process_response(self,request,response):
pass
def process_view(self,request,callback,callback_args,callback_kwargs):
pass
def process_exception(self,request,exception): #处理函数出现错误时执行
pass
def process_template_response(self, request, response):
pass #其中request 是 HttpRequest 对象, response 是一个由Django view或者中间件返回的TemplateResponse 对象,process_template_response()在 view 使用 render 渲染一个模版对象完成之后被调用,它必须返回一个render 方法执行后的response对象。
view.py
class cla:
def __init(self,req):
self.req=req
def render(self): #process_template_response 中间件自动调用render函数
return Httpresponse('asf')
def test(request):
return Foo(request)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/94a83d6a596957db27cd86cd2fd6a5ea.png#pic_center)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e315f0f0fb72154a6a2ad5033edbecb9.png)
利用中间件判断用户是否登录
class AuthMid(MiddlewareMixin):
def process_request(self, request):
now = '/1/'
white = [
now + 'login.html',
now + 'image_code',
now + 'register.html',
now + 'index.html'
]
try:
userinfo = request.session['userinfo']
userobj = models.User.objects.filter(**userinfo).first()
request.user = userobj
# 设置白名单:无需登录即可访问
except:
request.user = None
finally:
if request.user:
return
else:
url = request.path_info # url中的问好会变为空格
if url.strip() in white:
return
else:
return redirect('App1Login')