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


猜你喜欢
- MySQL的ALTER命令是非常有用的,当想改变表的名称,表的字段,或者如果要添加或删除一个现有的表中的列。让我们开始创建一个表名为test
- 最近一直在研究 Javascript 相关的技术。在《Javascript 高级程序设计》有篇章节着重阐述了优化 Javascri
- 在mysql数据库中,当我们需要模糊查询的时候 ,我们会使用到通配符。首先我们来了解一下2个概念,一个是操作符,一个是通配符。操作符like
- 1.conn.php <? $host="localhost"; //数据库服务器名称 $user="r
- 在论坛上看到了用Python登录微信并实现自动签到,才了解到一个新的Python库: itchat库文档说明链接在这:  
- 1.对于RGB三通道图片,直接用两层for循环的话,效率比较低2.可以先将RGB图片转为灰度图片,再利用numpy.where的广播机制统计
- [Python标准库]decimal——定点数和浮点数的数学运算 &n
- 基本思路使用GDAL创建Shapefile数据的基本步骤如下:使用osgeo.ogr.Driver的CreateDataSource()方法
- 1.建立连接字符串,里面包含数据库名称、用户名和密码2.建立操作字符串,里面是对数据操作的SQL语句3.建立Connection,用连接字符
- 目录项目地址:前言使用方式主要代码blive_record.pyconfig.py(配置文件)项目地址:https://github.com
- <script> function window.onload(){ if(location.href.indexOf('
- 本文实例讲述了python使用datetime模块计算各种时间间隔的方法。分享给大家供大家参考。具体分析如下:python中通过dateti
- // 去掉字符串的头空格(左空格) function LTrim(str){ var i; for(i=0;i<str.length;
- reshape函数:改变数组的维数(注意不是shape大小)>>> e= np.arange(10)>>>
- (以下内容部分内容参考了http://adomas.org/javascript-mouse-wheel/ )之前js 仿Photoshop
- 上一篇介绍了 HTML5 中 Canvas 的基本概念,这篇将要介绍一下 Canvas&n
- 在python中,一个文件(以“.py”为后缀名的文件)就叫做一个模块,每一个模块在python里都
- 企业网站好说,至少需要个虚拟主机什么的;可是OA,财务……这些内部系统就不好说了,总不能把代码和数据库扔给人家,写个说明,让他们自己照着说明
- OpenAI,由诸多硅谷大亨联合建立的人工智能非营利组织。2015年马斯克与其他硅谷科技大亨进行连续对话后,决定共同创建OpenAI,希望能
- python 如何实现Excel 的Vlookup功能1、Excel 中VLOOKUP具体步骤Excel 中的VLOOKUP使用说明采用下面