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全局启用登陆验证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 的问题

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

来源:http://mp.weixin.qq.com/s?__biz=MzU5MDY1MzcyOQ==&mid=2247484380&idx=1&sn=f2f325b452b2438e1985adec813313d2

标签:Django,登陆验证,login,required
0
投稿

猜你喜欢

  • 网站设计配色方案教程

    2007-10-10 19:38:00
  • Python 中的参数传递、返回值、浅拷贝、深拷贝

    2022-10-12 12:59:16
  • 正则表达式结合数组提取文章中的文件名

    2007-10-12 13:59:00
  • Python使用openpyxl模块处理Excel文件

    2021-10-03 06:45:10
  • python实现图像最近邻插值

    2023-02-01 00:03:34
  • Python中dict和set的用法讲解

    2023-12-09 05:20:55
  • pytest中文文档之编写断言

    2023-05-05 04:11:34
  • Python linecache.getline()读取文件中特定一行的脚本

    2023-03-09 13:18:05
  • 一篇文章快速了解Python的GIL

    2021-04-23 00:25:23
  • python实现机械分词之逆向最大匹配算法代码示例

    2022-01-02 08:16:27
  • 懒懒交流会:ClassName的长命名 VS. 短命名

    2009-11-28 16:08:00
  • Python Pillow(PIL)库的用法详解

    2022-01-31 13:43:26
  • javascript 常见汉字转换成拼音工具

    2008-03-03 16:54:00
  • python禁用键鼠与提权代码实例

    2022-12-11 11:54:59
  • js序列化和反序列化的使用讲解

    2023-08-05 08:13:24
  • Django Auth用户认证组件实现代码

    2022-05-02 18:06:01
  • 使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子

    2023-08-26 23:12:32
  • ASP中使用Form和QueryString集合

    2007-09-14 10:43:00
  • python reduce 函数使用详解

    2022-11-01 22:20:57
  • python解析xml简单示例

    2022-10-06 13:37:49
  • asp之家 网络编程 m.aspxhome.com