zoukankan      html  css  js  c++  java
  • Django+中间件+登录验证

      Django的request请求需要首先经过中间件处理,再通过URL查找到对应的views函数进行处理。在settings的MIDDLEWARE_CLASSES中

    添加设置中间件进行激活,大致原理如下图所示:

      

          在使用Django框架进行开发的过程中,遇到一个问题:要求对觉得多数页面请求request进行用户登录验证,如果用户没有登录则跳转回到登录页面;

    如果用户登录了,则直接跳转到新的链接页面?

          在django中提供了一种自定义装饰器@login_required来实现验证用户登录:

    复制代码
    1 # coding: utf-8
    2 from django.shortcuts import render
    3 from django.contrib.auth.decorators import login_required
    4 
    5 @login_required
    6 def home(request):
    7     return render(request, 'home.html')
    复制代码

        但是这种方式有一个不方便的地方:如果每添加一个功能需要验证登录,就需要添加@login_required来进行装饰。如果有大量的功能需要进行登录验证,

    工作量会增大。或者如果因为需求变化,删除装饰器,这种工作量会比较麻烦。

        所以在学习过程中,想到使用django的中间件来进行登录验证,在settings中增加参数,排除不需要登录的url,如:

    1
    2
    3
    4
    EXCLUDE_URL =  (
         '/login/',
        '/logout',      
    )

        然后再创建一个中间件模块,将此中间件添加到MIDDLEWARE_CLASSES中,定义process_request函数,对登录的url进行验证:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # coding: utf-8
    from djangoMiddleware.settings import EXCLUDE_URL
    from django.shortcuts import HttpResponseRedirect
    import re
     
    exclued_path = [re.compile(item) for item in EXCLUDE_URL]
     
    class PubAuthMiddleWare(MiddlewareMixin):
        def process_request(self, request):
            url_path = request.path
            for each in exclued_path:
                if re.match(each, url_path):
                    return
            if request.user.is_authenticated:
                return HttpResponseRedirect('/logout')
            else:
                return

         其中的exclude_path为不需要验证登录的url(白名单),直接return进入响应的views.fun进行处理。

        Django的中间件是很方便的,当需要对所有的request进行相同的处理时,可以使用中间件进行处理,很方便。

  • 相关阅读:
    HTTP协议
    Python学习--装饰器、列表生成式、生成器、map filter、json处理
    Python学习--多线程&多进程
    Python学习--发送邮件
    Python学习--异常处理
    【第五节】【Python学习】【configparser模块】
    【第一节】【shell脚本】【文件里的内容与变量中的内容大小写替换】
    【Python】【多线程多进程】
    【Selenium学习】【拖动滚动条】
    【Python】【异常的获取与处理】
  • 原文地址:https://www.cnblogs.com/wdbgqq/p/9822535.html
Copyright © 2011-2022 走看看