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进行处理。

扫描二维码关注公众号,回复: 3646500 查看本文章

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

猜你喜欢

转载自www.cnblogs.com/wdbgqq/p/9822535.html