【问题标题】:How to pass a view function with arguments in a decorator to another decorator in django如何将装饰器中带有参数的视图函数传递给django中的另一个装饰器
【发布时间】:2017-09-27 22:10:54
【问题描述】:

几个小时以来,我一直在努力寻找解决方案。我已经经历了很多SO posts,比如thisthisthis。我正在使用django-guardian 在我的 django 应用程序中实现对象级权限。我正在尝试implement permission_required decorator dynamically。这个想法是创建另一个装饰器,它可以在需要权限的装饰器之间切换,然后将视图函数传递给相应的权限需要装饰器。

urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', Test.as_view()),
    url(r'(?P<handle>[-\w]+)/(?P<method>[-\w]+)/(?P<id>[-\w]+)/$', Test.as_view(), name='handler'),
]

Views.py

class Test(View):
    @decorator_switch
    def get(self, request, *args, **kwargs):
        return HttpResponse('Test View')

decorator_switch

from api.mappings.permission_mappings import perm_mappings

def decorator_switch(func):

def wrapper(instance, request, *args, **kwargs):
    print(kwargs)
    permission_decorator = \
        perm_mappings.get('handles').get(kwargs.get('handle')).get('actions').get(kwargs.get('method'))
    return permission_decorator(func)(request)(args)(kwargs)
return wrapper

permission_mappings

from django.contrib.auth.decorators import permission_required as django_perm_req
from api.decorators.guardian_perm_req import permission_required as guardian_perm_req
from pyteam.models import Team

perm_mappings = {
    'handles': {
        'team': {
            'actions':  {
                'get': guardian_perm_req('pyteam.retrieve_team', (Team, 'id', 'id')),
                'create': django_perm_req('pyteams.add_team', raise_exception=True),
                'update': guardian_perm_req('pyteam.change_team', (Team, 'id', 'id')),
                'delete': guardian_perm_req('pyteam.delete_team', (Team, 'id', 'id'))
                }
            }
        }
    }

在此之后我打开了 url http://localhost:8000/team/get/1/ 但我遇到了一个异常

GuardianError 在 /team/get/1/

参数 id 没有传入视图函数

我检查了视图的 kwargs 以及 kwargs 中 id 的装饰器开关的装饰器 kwargs,我找到了它。然后我检查了 Guardian_perm_req 的包装函数,但是 def decorator(view_func):def _wrapped_view(request, *args, **kwargs): 没有得到导致这个问题的 url kwargs。

作为装饰器和基本函数,我尝试从装饰器开关本身调用和返回视图函数。

return permission_decorator(func(instance, request, args, kwargs))

但正如预期的那样,点击劫持中间件引发了异常

/team/get/1/ 处的 AttributeError

'function'对象没有属性'get'

非常感谢任何帮助。

TIA

【问题讨论】:

  • 你试过return permission_decorator(func)(instance, request, *args, **kwargs) ?
  • @L_S 我的错,我没试过。这解决了我的问题。请也发布一个答案,我可以将其标记为正确答案。非常感谢:)

标签: python django view arguments decorator


【解决方案1】:

试试这个

return permission_decorator(func)(instance, request, *args, **kwargs)

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2010-12-30
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2020-03-22
    • 2022-07-12
    • 2016-02-14
    • 2014-11-17
    相关资源
    最近更新 更多