Django全局启用登陆验证login_required的方法
作者:运维咖啡吧 发布时间:2021-05-29 12:49:31
Django在做后台系统过程中,我们通常都会为view函数添加 @login_required
装饰器,这个装饰器的主要作用就是在用户访问这个方法时,检查用户是否已经成功登陆,如果没有则重定向到登陆页面
登陆页面地址是通过 settings.LOGIN_URL
来获取的,默认为 /accounts/login/
页面,当然你也可以在settings配置文件中通过添加 LOGIN_URL
配置来改掉他,同时 @login_required
也接收参数 login_url
来指定登陆页面
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')
def home(request):
return JsonResponse({data': 'ops-coffee.cn'})
Middleware
通常对于一个后台系统来说,每一个页面都需要登陆才能访问,这样我们就需要给每一个view方法添加 @login_required
装饰器,那么有没有简单优雅一点的方式呢?可以通过Middleware中间件来实现
中间件位于用户请求和程序响应之间,当用户访问一个url之后并不是直接交给了view去处理,而是先经过中间件处理,然后再到了view,路线是这样的:user-->middleware-->view,所以针对全局所有view的操作就非常适合放在中间件里去处理
Django的中间件都定义在settings的 MIDDLEWARE
配置下,默认就添加了诸如auth、csrf之类的中间件
需要注意的是Django的中间件是有先后顺序的,对于接收到的请求默认从上到下依次执行,关于Django的中间件这里不过多介绍,查询相关文档即可
对于优雅处理用户访问view验证登陆的需求,我们就可以通过添加自定义的中间件来处理,方法非常简单
先来编写中间件类,代码如下:
from django.shortcuts import redirect
from django.conf import settings
class LoginRequiredMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.login_url = settings.LOGIN_URL
self.open_urls = [self.login_url] + getattr(settings, 'OPEN_URLS', [])
def __call__(self, request):
if not request.user.is_authenticated and request.path_info not in self.open_urls:
return redirect(self.login_url + '?next=' + request.path)
return self.get_response(request)
__init__ 和 __call__ 为middleware的固定格式
__init__ 函数,初始化了几个变量。需要注意的是定义了一个变量 open_urls ,这是一个list,包含所有不需要验证登陆的页面,提供了更强的灵活性,在这个列表里的url都不会验证是否登陆,默认将 login_url 添加到了 open_urls 列表中
__call__ 函数会判断当用户没有登陆且请求的URL不在 open_urls 列表中时,就直接给重定向到登陆页面
代码比较简单,这里不做过多解释
然后在setting配置文件的MIDDLEWARE中添加上边这个中间件的方法就可以了
MIDDLEWARE = [
'coffee.middleware.loginrequired.LoginRequiredMiddleware',
]
LoginRequiredMiddleware 中间件放在最后一行即可,前边为中间件类的路径, coffee 作为一个app,需要包含在 INSTALLED_APPS 内,目录结构大概如下:
webapp
- coffee
- middleware
- __init__.py
- loginrequired.py
- views.py
- webapp
- __init__.py
- settings.py
- urls.py
- manage.py
当我们有需要排除,不用检查是否登陆的URL时,只需要在settings配置文件中添加 OPEN_URLS 配置即可
OPEN_URLS = ['/devops/', '/webssh/']
至此,完美解决了所有view都需要添加 @login_required
的问题
中间件的合理运用,能帮助我们简化很多操作,编写优雅的代码,例如记录系统审计日志就可以通过中间件来方便的实现,试想一下,还有哪些地方可以用到呢?
来源:http://mp.weixin.qq.com/s?__biz=MzU5MDY1MzcyOQ==&mid=2247484380&idx=1&sn=f2f325b452b2438e1985adec813313d2
猜你喜欢
- 一 前期说明:我运行项目的环境是nginx+php,存储代码用的是gitlab,python版本:3.6 django版本:2.2.1 my
- 首先介绍下简朝阳.现就职于阿里巴巴(中国)网络技术有限公司DBA Team运维部, 简朝阳是本次MYSQL技术征文大赛第三名得主(获奖文章:
- 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如:>>>
- 一、python线程的模块1.1 thread和threading模块thread模块提供了基本的线程和锁的支持threading提供了更高
- 生成HTML方法主要步骤只有两个:一、获取要生成的html文件的内容二、将获取的html文件内容保存为html文件我在这里主要说明的只是第一
- 在计算机软件领域,缓存(Cache)指的是将部分数据存储在内存中,以便下次能够更快地访问这些数据,这也是一个典型的用空间换时间的例子。一般用
- 问:假如我的一个表里含有(a,b,c,d)和(a,b)形成组合键。我能在列值中写这个查询吗?例如: select a,c,d from my
- 解决办法: 1.新建一个同名的数据库(数据文件与原来的要一致) 2.再停掉sql server(注意不要分离数据库) 3.用原数据库的数据文
- 如何为XHTML做好准备,XHTML与HTML 4.01标准没有太多的不同。所以将你的代码升级至4.01是个不错的开始。HTML 4.01参
- 本文实例讲述了python简单获取数组元素个数的方法。分享给大家供大家参考。具体如下:mySeq = [1,2,3,4,5] p
- 网上的很多PHP微信支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入微信支付的带来
- 1 数据库连接a.数据库的连接(ACCESS和SQL)在APS脚本中可以通过3中方式访问数据库: ∈IDC (Inte
- MS SQL基本语法及实例操作 一:建表并初始化 ============================ create database
- dictionary对象和数组有点相似,但无需用redim来改变dictionary的大小,dictionary也没有多维,dictiona
- 写在之前这几天的阅读量蜜汁低,是什么原因我也没搞清楚,如果你们觉得我哪里写的有问题,或者是哪里不好,欢迎后台或者微信告知我,先行谢过。昨天的
- 本文实例讲述了php数组索引与键值操作技巧。分享给大家供大家参考。具体如下:<?php $array = array("a&
- PyCharm是由JetBrains打造的一款Python IDE,VS2010的重构插件Resharper就是出自JetBrains之手。
- 每一字符串字符文字有一个字符集和一个校对规则,它不能为空。一个字符串文字可能有一个可选的字符集引介词和COLLATE子句:[_charset
- 获取一组href元素属性的值lst = driver.find_elements_by_class_name("ib-it-tex
- 是否应该开启缓冲器? 通过脚本程序启动缓冲器 在ASP脚本的顶部包含Response.Buffer=True ,IIS就会将页面的内容缓存。