如何批量的在django中对url进行用户登陆限制
参考URL:
https://blog.csdn.net/hanshengzhao/article/details/79540306?utm_source=blogxgwz0
1,首先定义一个内部有装饰器的函数,解析出每一个url中的path,并将login_required加在其前面。
def required(wrapping_functions, patterns_rslt):
if not hasattr(wrapping_functions, '__iter__'):
wrapping_functions = (wrapping_functions,)
return [
_wrap_instance__resolve(wrapping_functions, instance)
for instance in patterns_rslt
]
def _wrap_instance__resolve(wrapping_functions, instance):
if not hasattr(instance, 'resolve'): return instance
resolve = getattr(instance, 'resolve')
def _wrap_func_in_returned_resolver_match(*args, **kwargs):
rslt = resolve(*args, **kwargs)
if not hasattr(rslt, 'func'): return rslt
f = getattr(rslt, 'func')
for _f in reversed(wrapping_functions):
# @decorate the function from inner to outter
f = _f(f)
setattr(rslt, 'func', f)
return rslt
setattr(instance, 'resolve', _wrap_func_in_returned_resolver_match)
return instance
2,在url.py中,将需要登陆的url放在urlpatterns_base列表中,之后,统一调用required函数进行登陆登陆。而不需要登陆的函数,就可以放在最后的urlpatterns延长列表之中。用户登陆的url千万不要放在base里。
"""
在urlpatterns_base统一定义需要用户登陆的url,且放置于required前面
不需要登陆的url,统一放在urlpatterns,位于required后面。
accounts用户登陆模块本身不需要登陆,不然会陷入循环要求登陆。
"""
urlpatterns_base = [
path('', IndexView.as_view(), name='index'),
path('admin/', admin.site.urls),
]
urlpatterns_base += [
path('public/', include('public.urls')),
]
urlpatterns_base += [
path('order/', include('order.urls')),
# 取决于 order.urls里有没有app_name变量,以及实例命名和应用命名空间,写法多变
# 不管如何改变写法,app_namespace是必须的,而namespace是可选的
# path('order/', include(('order.urls', 'order'))), # 只定义app_name,两个括号不可少
# path('order/', include('order.urls')), # 这种情况下,下一层已定义好app_name
# path('order/', include('order.urls'), namespace='order'), # 这种情况下,下一层已定义好app_name
# path('order/', include(('order.urls', 'order'), namespace='order')), # 全写在第一层
]
# 为哪些url加上登陆要求
urlpatterns = required(
login_required,
urlpatterns_base
)
urlpatterns += [
path('accounts/', include('accounts.urls')),
]
如何批量的在django中对url进行用户登陆限制的更多相关文章
- Django中间件 及 form 实现用户登陆
Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误 ...
- 利用Django中的url方法实现地址动态拼接自动生成超链接地址
目标 建立一个图书列表页面,显示图书名列表,并实现点击书名跳转到图书详细页面,显示图书详细信息. URL方法简介 功能:返回一个绝对路径的引用(不包含域名的URL):该引用匹配一个给定的视图函数和 一 ...
- [UnicodeEncodeError]:Django中解决URL中文解释乱码问题
Django中在使用HttpResponseRedirect的时候,跳转URL中如果存在中文,会报错:会报UnicodeEncodeError错误. 解决办法: 使用urlquote对URL进行编码 ...
- django中的url控制
1.django中的第一个控件:url控制 (路由分发) urls.py:请求路径与视图函数的之间的关系 步骤: 1.首先是要配置环境, 2.其次就是引路径 3.在视图的文件夹里面写相应的函 ...
- django 使用装饰器验证用户登陆
使用装饰器验证用户登陆,需要使用@method_decorator 首先需引用,method_decorator,并定义一个闭包 from django.utils.decorators import ...
- 给Django中的url起名字
url反转 =>reverse 1.from django.shortcuts import reverse 2. 利用reverse函数对URL名称进行反转 reverse(url名称 ...
- Django中的URL映射
1.为什么回去urls.py文件中寻找映射呢? 因为在settings.py中配置了ROOT_URLCONF为urls.py: ROOT_URLCONF = 'first_project.urls' ...
- Django中,ajax检测注册用户信息是否可用?
ajax检测注册用户信息主体思路 1.在settings.py中配置需要使用的信息 #对static文件进行配置 STATICFILES_DIRS=[ os.path.join(BASE_DIR,'s ...
- DJANGO中如何用邮箱来登陆?
就是另一个不同的登陆backend. 而DJANGO会尝不同的方式,哪个成功就用哪个 authentication.py from django.contrib.auth.models import ...
随机推荐
- CircleList-使用UGUI实现的圆形列表
CircleList CircleList是一个通过UGUI实现的圆形列表,通过缩放.平移和层级的改变模拟一个3D的圆形列表. 效果 添加与旋转 间距调整 椭圆形的旋转 参数 CenterX: 椭圆圆 ...
- centos 重启日志服务
因为/var/log/message日志太多了,遂手贱删掉了这个文件,新建messages,发现没有日志写入 正确清空日志的方法 cat /dev/null > /var/log/boot.lo ...
- Linux下删除命令 硬盘空间查看... 常用命令
(此命令请慎重使用) 使用rm -rf命令即可. 使用rm -rf 目录名字 命令即可 -r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思 (警告:不作任何 ...
- Mac下使用Wine安装PowerDesigner15
下载: (链接: https://pan.baidu.com/s/1bpEYyIV 密码: 5ymj) 安装: 1.安装Wine 参考:http://www.cnblogs.com/EasonJim/ ...
- Kafka0.10.0安装配置
1 解压文件 tar -zvxf kafka_2.11-0.10.0.0.tgz 2 修改配置server.properties vim server.properties broker.id=1 z ...
- 如何利用 Jmeter 测试上传文件
在查看本文的前提,有如下几点: 会使用Jmeter,知道如何去添加http请求的sampler 会利用Jmeter完成基本的http请求或者是接口测试 知道文件上传是怎么回事 言归正传,其实文件上传我 ...
- php rsa理解
参考链接:http://www.cnblogs.com/firstForEver/p/5803940.html 自己封装的一个类: <?php class CRsaAuthorization { ...
- windows cmd相关操作
一:文件夹1. 新建文件夹方式一:md[盘符:\][路径\]新目录例如:md c:\test\newtest 方式二:先使用cmd进入需要新建文件的根目录下,使用md或者mkdir 直接创建文件夹ne ...
- js实现获取两个日期之间所有日期最简单的方法
Date.prototype.format = function() { var s = ''; var mouth = (this.getMonth() + 1)>=10?(this.getM ...
- ActiveMQ学习笔记1
1.接口 JMS 公共 点对点域 发布/订阅域 ConnectionFactory QueueConnectionFactory TopicConnectionFactory Connection Q ...