如果不用中间件做认证,有两种办法可以做认证:
1 通过login_required,在views.py里做认证
from django.contrib.auth.decorators import login_required
@login_required(login_url='login')
def reply_del(request, comment_pk):
执行这个函数之前,先会检查是否已做认证(通过游览器发送cookie,django检查cookie对应的value是否在数据库的session当中,来判断是否已做认证).如果未完成认证,则跳转到认证页面,如果已完成认证,则执行该函数.
2 通过login_required,在urls.py里做认证
from django.contrib.auth.decorators import login_required
urlpatterns = [
path('student', login_required(students, login_url='login'), name='students'),
执行这个url对应的函数之前,先会检查是否已做认证(通过游览器发送cookie,django检查cookie对应的value是否在数据库的session当中,来判断是否已做认证).如果未完成 认证,则跳转到认证页面,如果已完成认证,则执行url对应的函数
以上两种认证方式都存在一个问题,当需要整个系统需要做认证时,必须在每个函数和每个url,通过login_required
采用中间件做认证
中间件用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。
怎么自定义中间件
步骤1:在任意地方定义类 继承 MiddlewareMixin(必须要继承这个类)
步骤2:注册中间件
步骤1:在任意地方定义类 继承 MiddlewareMixin(必须要继承这个类)
新建一个MIDDLEWARE.py文件,将其放在与manage.py同级目录,然后协商如下代码:
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect, HttpResponse, render
from django.urls import reverse
class AllRequestAuth(MiddlewareMixin):
def process_request(self, request):
"""
所有跟登入页面相关的URL地址,都要做免认证,比如CSS 或JS等,否则会打不开.
startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。
如果参数 beg 和 end 指定值,则在指定范围内检查。
"""
# 登入页面要做免认证
login_page = request.path.startswith(reverse('login'))
# 登入页面的验证码也要坐免认证,否则就打不开了.
valid_num_img = request.path.startswith(reverse('get_valid_img'))
# 如果打开的网站,不是登入页面 也没有验证码 同时账号还没有做过认证,三个条件同时匹配时,重定向login页面做认证.
if not login_page and not valid_num_img and not request.user.is_authenticated:
# 下面的return代码,也可以按照这种方式写: redirect(reverse('login') + "?next=%s" % request.get_full_path())
return redirect(reverse('login') + "?next={}".format(request.get_full_path()))
步骤2:注册中间件
在settings.py的"MIDDLEWARE"变量里,注册:
注意:如果MIDDLEWARE.py不是与manage.py放在同一级目录,比如放在school目录,那么注册地址为: ‘school.MIDDLEWARE.AllRequestAuth’,
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',
'MIDDLEWARE.AllRequestAuth', # 这个是我们新加的中间件
]
注意:中间件依次从上往下执行每个中间件里的process_request方法.
通过以上配置,即可完成认证.这里一定要把认证页面相关的url地址排除掉,不做重定向认证页面,否则会出错.