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入门篇之编程习惯与特点
Oct 17 Python
python实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
Python+OpenCV实现车牌字符分割和识别
Mar 31 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
java中的控制结构(if,循环)详解
Jun 26 Python
Mac安装python3的方法步骤
Aug 09 Python
Python依赖包整体迁移方法详解
Aug 15 Python
Python+OpenCV实现旋转文本校正方式
Jan 09 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
IDLE下Python文件编辑和运行操作
Apr 25 Python
Python基于gevent实现文件字符串查找器
Aug 11 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 setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
js控制框架刷新
2008/08/01 Javascript
jqgrid 简单学习笔记
2011/05/03 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
python插入数据到列表的方法
2015/04/30 Python
Python学习教程之常用的内置函数大全
2017/07/14 Python
Python实现学生成绩管理系统
2020/04/05 Python
python 限制函数调用次数的实例讲解
2018/04/21 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
Python代码太长换行的实现
2019/07/05 Python
python函数不定长参数使用方法解析
2019/12/14 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
美国智能家居专家:tink
2019/06/04 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
介绍一下游标
2012/01/10 面试题
大学生个人求职信范文
2013/09/21 职场文书
委托证明的格式
2014/01/10 职场文书
应届毕业生个人求职信范文
2014/01/29 职场文书
廉洁自律承诺书
2014/03/27 职场文书
技术比武方案
2014/05/19 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
降价通知函
2015/04/23 职场文书