gpt4 book ai didi

django - @method_decorator 与 login_required 和permission_required

转载 作者:行者123 更新时间:2023-12-02 05:59:01 27 4
gpt4 key购买 nike

我正在使用基于类的 View ,我想确保每个 View 都可以由登录用户和一种类型的用户访问(有两组用户 - 每组都有不同的权限) 。

我正在根据具有权限的文档来实现此操作(我正在使用 Django 1.7.7)https://docs.djangoproject.com/en/1.7/topics/class-based-views/intro/#decorating-the-class ,但是使用两个参数会引发错误“method_decorator() 仅需要 1 个参数(给定 2 个)”。

因此 - 如何在基于类的 View 中验证这两个因素(登录和权限)?

class PatientCreate(CreateView):
model = Patient
fields = '__all__'

@method_decorator(login_required, permission_required('patient.session.can_add_patient'))
def dispatch(self, *args, **kwargs):
return super(PatientCreate, self).dispatch(*args, **kwargs)

谢谢!

最佳答案

就您而言,permission_required将为未登录的用户重定向到登录页面,因此您不需要使用 login_required完全没有。

@method_decorator(permission_required('patient.session.can_add_patient')
def dispatch(self, *args, **kwargs):
...

如果你确实需要使用多个装饰器,那么你可以在 Django 1.9+ 中使用列表

decorators = [other_decorator, permission_required('patient.session.can_add_patient')] 

class PatientCreate(CreateView):
model = Patient
fields = '__all__'

@method_decorator(decorators)
def dispatch(self, *args, **kwargs):
...

您还可以通过修饰类本身来缩短代码:

@method_decorator(decorators, name="dispatch")
class PatientCreate(CreateView):
model = Patient
fields = '__all__'

在 Django 1.8 及更早版本中,您无法将列表传递给 method_decorator或者装饰类,所以你必须堆叠装饰器

class PatientCreate(CreateView):
model = Patient
fields = '__all__'

@method_decorator(other_decorator)
@method_decorator(permission_required('patient.session.can_add_patient'))
def dispatch(self, *args, **kwargs):
...

装饰器将按照传递给 method_decorator 的顺序处理请求。 。因此,对于上面的示例,other_decorator将在 permission_required 之前运行.

关于django - @method_decorator 与 login_required 和permission_required,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29673549/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com