Django+中间件+登录验证

  Django的request请求须要首先通过中间件处理,再经过URL查找到对应的views函数进行处理。在settings的MIDDLEWARE_CLASSES中添加设置中间件进行激活,大体原理以下图所示:html

  

    在使用Django框架进行开发的过程当中,遇到一个问题:要求对以为多数页面请求request进行用户登陆验证,若是用户没有登陆则跳转回到登陆页面;若是用户登陆了,则直接跳转到新的连接页面?python

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

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,如:函数

EXCLUDE_URL =  (
     '/login/',
    '/logout',       
)

  而后再建立一个中间件模块,将此中间件添加到MIDDLEWARE_CLASSES中,定义process_request函数,对登陆的url进行验证:学习

  

# 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:

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

  Django的中间件是很方便的,当须要对全部的request进行相同的处理时,可使用中间件进行处理,很方便。url

相关文章
相关标签/搜索