Django+中间件+登陆验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,如:

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

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

  

  

以上是关于Django+中间件+登陆验证的主要内容,如果未能解决你的问题,请参考以下文章

Django中间件 及 form 实现用户登陆

Django —— 验证码,中间件

Django:用户认证组件 & 中间件

JSP 设计教师与学生不同登陆界面(带验证码)

自动化运维Python系列之Django CSRF跨站请求伪造中间件

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段