登录装饰器在该项目中的缺陷
从上图可以发现,每当创建一个视图函数时都需要在函数名中添加装饰器,这里项目功能不多所以面对这个问题产生的影响较小,但是当项目功能更多时,这种就会让开发者烦恼
所以Django开发者也想到这个问题,所以就有一些特点的中间件来解决这些小问题
中间件
在此之前先了解一下Django的中间件
改变全局范围内Django的请求和响应。慎用!!!
Django中有一些内置的中间件,每一个中间件都有特定的功能。
自定义中间件
创建中间件
注册
覆写方法
MiddlewareMixin有五个方法需要我们覆盖,可以选择性覆盖接下来就一一讲解每个方法的作用
对于装饰器我们就只要用到覆盖第一个方法即可,因为我们需要在确认是否登录才能实现其他视图函数
用中间件代替装饰器
在上面的过程中我们已经创建并注册了中间件
接下来就是覆盖第一个方法了
middleware\authmiddleware.py
from django.shortcuts import redirect, render
from django.utils.deprecation import MiddlewareMixin
class AuthMD(MiddlewareMixin):
# 在视图函数执行之前执行
# 白名单
white_list = [
'/seller/login', # 登录
'/seller/register', # 注册
]
def process_request(self,request):
# 获取url
path=request.path_info
if path.find("seller")!=-1:
if path in self.white_list:
return None #放行
else:
# 判断是否已经登录,如果没有登录自动跳转到登录界面
if request.COOKIES.get("seller_id"):
return None
else:
return redirect('/seller/login')
# #在视图函数有异常的时候执行
def process_response(self,request,response):
if response.status_code == 404 or response.status_code == 500:
return render(request,"404/index.html")
else:
return response
写完代码我们就可以去视图函数中去掉登录装饰器了
测试
http://127.0.0.1:8000/
这里因为我添加了404页面
当路由找不到时会自动跳转到404页面
当我们访问http://127.0.0.1:8000/seller时因为我们没有登录结果自动跳转到了登录界面
当我们登录后