【发布时间】:2017-09-27 22:10:54
【问题描述】:
几个小时以来,我一直在努力寻找解决方案。我已经经历了很多SO posts,比如this、this和this。我正在使用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