Django采用中间件做认证

如果不用中间件做认证,有两种办法可以做认证:
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地址排除掉,不做重定向认证页面,否则会出错.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值