参考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进行用户登陆限制的更多相关文章

  1. Django中间件 及 form 实现用户登陆

    Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误 ...

  2. 利用Django中的url方法实现地址动态拼接自动生成超链接地址

    目标 建立一个图书列表页面,显示图书名列表,并实现点击书名跳转到图书详细页面,显示图书详细信息. URL方法简介 功能:返回一个绝对路径的引用(不包含域名的URL):该引用匹配一个给定的视图函数和 一 ...

  3. [UnicodeEncodeError]:Django中解决URL中文解释乱码问题

    Django中在使用HttpResponseRedirect的时候,跳转URL中如果存在中文,会报错:会报UnicodeEncodeError错误. 解决办法: 使用urlquote对URL进行编码 ...

  4. django中的url控制

    1.django中的第一个控件:url控制  (路由分发) urls.py:请求路径与视图函数的之间的关系 步骤: 1.首先是要配置环境,   2.其次就是引路径   3.在视图的文件夹里面写相应的函 ...

  5. django 使用装饰器验证用户登陆

    使用装饰器验证用户登陆,需要使用@method_decorator 首先需引用,method_decorator,并定义一个闭包 from django.utils.decorators import ...

  6. 给Django中的url起名字

    url反转  =>reverse 1.from django.shortcuts  import  reverse 2. 利用reverse函数对URL名称进行反转  reverse(url名称 ...

  7. Django中的URL映射

    1.为什么回去urls.py文件中寻找映射呢? 因为在settings.py中配置了ROOT_URLCONF为urls.py: ROOT_URLCONF = 'first_project.urls' ...

  8. Django中,ajax检测注册用户信息是否可用?

    ajax检测注册用户信息主体思路 1.在settings.py中配置需要使用的信息 #对static文件进行配置 STATICFILES_DIRS=[ os.path.join(BASE_DIR,'s ...

  9. DJANGO中如何用邮箱来登陆?

    就是另一个不同的登陆backend. 而DJANGO会尝不同的方式,哪个成功就用哪个 authentication.py from django.contrib.auth.models import ...

随机推荐

  1. .NET MVC中的防CSRF攻击

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  2. Socket 连接建立过程

    阻塞模式下: 1,客户端向服务器端发起请求建立连接时,服务器端只需要运行到 serverSocket = ); 客户端注册的  SelectionKey.OP_CONNECT 事件就能够发生. 也就是 ...

  3. JAVA 并发编程学习(2)之基本概念

    1,是不是线程创建越多越好? 当一个程序创建了大量的线程时,活跃的线程会消耗内存.若可运行的线程数量多于可用处理器的数量,那么有些线程将闲置.大量空闲的线程会占用许多内存,给垃圾回收带来压力,而且大量 ...

  4. EasyUI动态修改easyui-textbox验证信息

    <tr> <td>编码:</td> <td><input type="text" id="code" na ...

  5. MySQL - 日常操作二 备份还原

    登录mysql的命令 # 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 mysql -h 110. -P3306 -uroot -p mysql -uroot -p -S /dat ...

  6. 第16月第17天 contentMode

    1. self.contentMode = UIViewContentModeScaleAspectFill; self.clipsToBounds = YES; http://blog.csdn.n ...

  7. dbeaver can't connect HBase1.2 using phoenix driver #1863

    1 第一个问题 Unexpected version format: 10.0.2 Unexpected version format: 10.0.2 Unexpected version forma ...

  8. 修改mysql的用户root密码

    第一种方法:root用户登录系统/usr/local/mysql/bin/mysqladmin -u root -p password 新密码enter password 旧密码 第二种方法:root ...

  9. 为小程序开发创建本地mock数据服务器

    开发时使用easy-mock的服务,不是大厂就不是大厂,实在恶心,每天都会有卡的这么一段时间 于是,自己建个本地mock服务算了,想使用express 但是必须把json数据里面的不同对象,分配到不同 ...

  10. Go 语言读书笔记

    Go语言的设计理念很明确,就是将动态类型语言的编程容易度和静态类型语言的安全效率结合起来.     Go语言,又称Golang,是Google开发的一款静态强类型.编译型.并发型,并具有垃圾回收机制的 ...