django login_required 在include 中添加

参考自
https://codeday.me/bug/20171128/102555.html

在写django 项目的时候,我的习惯是最后写权限控制,最简单的就是要写login_required了 。
正常情况下是在各个views 函数上面,一个个的加上装饰器。

@login_required
def index(request):
    pass 

再认真一点就是在url那里加上login_required。

urlpatterns = [
    path('user/', login_required(user_manage), name="account_users_index"),
     path('user/', login_required()(UserList.as_view()), name='account_users_list'),
]

但是如果路由再多一点,添加的工作量还是很大。如果要修改,就更麻烦了。

解决方案来了。就是在需要的地方只加一次。所有的都加。

#!/bin/env python
# -*- coding:utf-8 -*-

def required(wrapping_functions, patterns_rslt):
    '''
    Used to require 1..n decorators in any view returned by a url tree

    Usage:
      urlpatterns = required(func,patterns(...))
      urlpatterns = required((func,func,func),patterns(...))

    Note:
      Use functools.partial to pass keyword params to the required
      decorators. If you need to pass args you will have to write a
      wrapper function.

    Example:
      from functools import partial

      urlpatterns = required(
          partial(login_required,login_url='/accounts/login/'),
          patterns(...)
      )
    '''
    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

具体用法

urlpatterns_base = [
    path('', index_view),
]
urlpatterns = required(
    login_required,
    urlpatterns_base
)

urlpatterns += [
    path('login', include(zjxl_sso.get_login_urls())),
]
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值