Django全局启用登陆验证login_required的方法


Posted in Python onJune 02, 2020

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全局启用登陆验证login_required的方法

需要注意的是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 的问题

中间件的合理运用,能帮助我们简化很多操作,编写优雅的代码,例如记录系统审计日志就可以通过中间件来方便的实现,试想一下,还有哪些地方可以用到呢?

总结

到此这篇关于Django全局启用登陆验证login_required的方法的文章就介绍到这了,更多相关django登陆验证login_required内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python yield 使用浅析
May 28 Python
Python上传package到Pypi(代码简单)
Feb 06 Python
Python使用pymysql小技巧
Jun 04 Python
Python流程控制 while循环实现解析
Sep 02 Python
matplotlib.pyplot画图并导出保存的实例
Dec 07 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
通过实例了解Python异常处理机制底层实现
Jul 23 Python
Python将字典转换为XML的方法
Aug 01 Python
Python列表推导式实现代码实例
Sep 09 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
Python自动操作神器PyAutoGUI的使用教程
Jun 16 Python
python爬虫基础知识点整理
Jun 02 #Python
如何理解python面向对象编程
Jun 01 #Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 #Python
matlab、python中矩阵的互相导入导出方式
Jun 01 #Python
如何理解Python中的变量
Jun 01 #Python
pycharm实现print输出保存到txt文件
Jun 01 #Python
Python如何爬取qq音乐歌词到本地
Jun 01 #Python
You might like
PHP 字符串操作入门教程
2006/12/06 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
jquery replace方法去空格
2017/05/08 jQuery
vue2实现可复用的轮播图carousel组件详解
2017/11/27 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
node.js使用fs读取文件出错的解决方案
2019/10/23 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python实现倒计时的示例
2014/02/14 Python
python中的字典详细介绍
2014/09/18 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
python DataFrame 取差集实例
2019/01/30 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
flask实现验证码并验证功能
2019/12/05 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
体育系毕业生求职自荐信
2014/04/16 职场文书
大学学风建设方案
2014/05/04 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis