现在我正在使用这个应用程序进行权限检查:django-rules
然而,它已经一年多没有更新了,并且没有用于"new"(自 django 1.3 起)基于类的 View 的装饰器。我希望能够像这样在 urls.py 中使用:
url(r'^casos/(?P<pk>\d+)/editar/$', rules_permission_required('lawsuits.logical_check', raise_exception=True)(CaseUpdateView.as_view()), name='case_edit'),
我不知道如何从装饰器的基于类的 View 中获取对象。你们有什么想法吗?这是我到目前为止所拥有的:
from django.utils.decorators import available_attrs
def rules_permission_required(perm, queryset=None, login_url=None, raise_exception=False):
def wrapper(view_func):
@wraps(view_func, assigned=available_attrs(view_func))
def inner(request, *args, **kwargs):
#view_func is the class based view -> <function MyEditView at 0x94e54c4>
print view_func.get_object() # doesnt work
print view_func(request, *args, **kwargs).get_object() # doesnt work either
#any ideas?
if not request.user.has_perm(perm, obj=obj):
return redirect_to_login(request, login_url, raise_exception)
return view_func(request, *args, **kwargs)
return inner
return wrapper
提前谢谢了!
最佳答案
使用 method_decorator
在 dispatch() 方法上:https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-class-based-views
from django.utils.decorators import method_decorator
class ClassBasedView(View):
@method_decorator(rules_permission_required)
def dispatch(self, *args, **kwargs):
return super(ClassBasedView, self).dispatch(*args, **kwargs)
或者你可以装饰
as_view
的输出类方法,或者在你的 url 配置中(如上面的链接中所述),或者通过将实例保存到变量中。class ClassBasedView(View):
def dispatch(self, *args, **kwargs):
return super(ClassBasedView, self).dispatch(*args, **kwargs)
class_based_view = rules_permission_required(ClassBasedView.as_view())
虽然我不太确定最后一个例子是否会导致线程安全问题(取决于 Django 如何处理实例)。最好的方法可能是坚持使用
method_decorator
.
关于django - 如何为基于类的 View 编写装饰器——基于 View 对象的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10012039/