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比较2个xml内容的方法
May 11 Python
Python实现二分查找算法实例
May 26 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
Jun 09 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
python的继承知识点总结
Dec 10 Python
python调用外部程序的实操步骤
Mar 04 Python
python 串口读取+存储+输出处理实例
Dec 26 Python
Python AutoCAD 系统设置的实现方法
Apr 01 Python
Python如何把十进制数转换成ip地址
May 25 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 Python
Python使用tkinter实现小时钟效果
Feb 22 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文本转图片自动换行的方法
2013/03/13 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
前端性能优化及技巧
2016/05/06 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
python实现同一局域网下传输图片
2020/03/20 Python
如何一键升级Python所有包
2020/11/05 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
this关键字的含义
2015/04/08 面试题
机关节能减排实施方案
2014/03/17 职场文书
建设工地安全标语
2014/06/07 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
长城导游词300字
2015/01/30 职场文书
父母教会我观后感
2015/06/17 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
用Python爬取某乎手机APP数据
2021/06/15 Python
Redis唯一ID生成器的实现
2022/07/07 Redis
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers