栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否可以用login_required装饰Django URL中的include(…)?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否可以用login_required装饰Django URL中的include(…)?

这是可行的,实际上我为此找到了两个 片段。

解决方案1
棉花替代品的第一个片段,

RegexURLPattern
以及
RegexURLResolver在resolve
通话期间注入给定装饰器的自定义实现。

from django.core.urlresolvers import RegexURLPattern, RegexURLResolverfrom django.conf.urls.defaults import patterns, url, includefrom django.contrib import adminfrom myproject.myapp.decorators import superuser_requiredclass DecoratedURLPattern(RegexURLPattern):    def resolve(self, *args, **kwargs):        result = super(DecoratedURLPattern, self).resolve(*args, **kwargs)        if result: result.func = self._decorate_with(result.func)        return resultclass DecoratedRegexURLResolver(RegexURLResolver):    def resolve(self, *args, **kwargs):        result = super(DecoratedRegexURLResolver, self).resolve(*args, **kwargs)        if result: result.func = self._decorate_with(result.func)        return resultdef decorated_includes(func, includes, *args, **kwargs):    urlconf_module, app_name, namespace = includes    for item in urlconf_module:        if isinstance(item, RegexURLPattern): item.__class__ = DecoratedURLPattern item._decorate_with = func        elif isinstance(item, RegexURLResolver): item.__class__ = DecoratedRegexURLResolver item._decorate_with = func    return urlconf_module, app_name, namespace

你需要像这样使用它:

urlpatterns = patterns('',    # ...    (r'^private/', decorated_includes(login_required, include(private.urls))),)

(请注意,

include
此方法不能将参数作为字符串。)

解决方案#2
sjzabel的另一个解决方案(我最终使用了我自己)在外部

patterns
调用中应用,因此可以与字符串一起使用,并且语法略有不同。但是,想法是一样的。

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 = patterns('',    # ...)urlpatterns += required(    login_required,    patterns('',        (r'^private/', include('private.urls'))    ))

两者都能正常工作,但我更喜欢后一种语法。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/404895.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号