Python Django-用户对某些视图的权限?
从管理员那里,我看到您可以将权限分配给用户或用户组:允许添加、更改或删除模型中的数据 这很好,但我还需要允许用户或用户组访问或不访问一组视图。我的网站上有特定类型的服务,因此我希望允许某些用户访问特定的服务(页面/视图),但不允许其他用户访问Python Django-用户对某些视图的权限?,python,django,django-authentication,django-permissions,django-login,Python,Django,Django Authentication,Django Permissions,Django Login,从管理员那里,我看到您可以将权限分配给用户或用户组:允许添加、更改或删除模型中的数据 这很好,但我还需要允许用户或用户组访问或不访问一组视图。我的网站上有特定类型的服务,因此我希望允许某些用户访问特定的服务(页面/视图),但不允许其他用户访问 那么,我如何允许某些用户/用户组访问某些视图?谢谢大家! 无法添加或更改某个模型的用户将无法在管理中看到该模型 如果我们讨论的是自定义创建的视图,那么您可以创建一些东西来检查用户的权限,如果他们没有该权限,则返回404。权限链接到模型,可以为组分配各种权限
那么,我如何允许某些用户/用户组访问某些视图?谢谢大家! 无法添加或更改某个模型的用户将无法在管理中看到该模型 如果我们讨论的是自定义创建的视图,那么您可以创建一些东西来检查用户的权限,如果他们没有该权限,则返回404。权限链接到模型,可以为组分配各种权限 您可以向模型添加权限,如下所示:
# myproject/myapp/models.py
class MyModel(models.Model):
class Meta:
permissions = (
('permission_code', 'Friendly permission description'),
)
@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
# ...
然后,您可以检查用户是否具有以下权限:
# myproject/myapp/models.py
class MyModel(models.Model):
class Meta:
permissions = (
('permission_code', 'Friendly permission description'),
)
@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
# ...
使用权限,您只需使用管理界面即可轻松地从用户和组中添加或删除权限。您需要手动管理权限,但这非常简单。大概有一个属性决定了一个组是否有权限查看一个视图:如果用户是否有特定权限是一个简单的问题,那么您只需使用
permission\u required
decorator来装饰该视图,或者user\u通过测试
,如果有点复杂:
@user_passes_test(lambda u: u.is_allowed_to_see_view_myview())
def myview(request):
...etc...
假设被\u允许\u查看\u查看\u myview
是用户对象上的某种方法
权限系统非常全面。权限系统以模型为中心,并假设权限与模型相关联。我认为以下两种选择是最好的选择: A.如果您的视图与某个特定模型相关,请按照Marcus Whybrow的建议对该模型使用自定义权限 B.[未测试,可能不起作用]子类
User
,并在那里定义您自己的权限。您不需要实际的模型,它只是应用程序自定义权限的包装:
from django.contrib.auth.models import User
class MyUser(User):
class Meta:
permissions = (('can_visit_$viewset1', 'Can visit $view_set_1'))
不要忘记运行
syncdb
向数据库添加自定义权限。对于基于类的视图,您可以将userpassestimixin
类继承到视图中,并定义test\u func
from django.contrib.auth.mixins import UserPassesTestMixin
class MainView(UserPassesTestMixin, View):
def test_func(self):
return self.request.user.has_perm('app.get_main_view')
有关如何使用它的更多详细信息,请参阅:如果您使用的是Django 1.9+,您应该能够使用: 例如:
来自django.contrib.auth.mixin导入权限RequiredMixin
类主视图(PermissionRequiredMixin,视图):
所需权限='my\u services.foo\u bar'
...
这基本上是
userpassestimixin
的一个特例,专门用于测试用户是否具有指定的权限。是的,我指的是我创建的自定义视图,而不是管理员。谢谢。我试试看。看起来相对简单。@所需的权限将更简单、更优雅here@Manur听起来好多了,是的。我在2011年1月回答了这个问题:但我不记得当时是否有所需的权限
decorator。请确保迁移或syncdb来使用它们。我绞尽脑汁想弄明白这一点,直到我发现:从Django 1.3开始,没有办法对用户进行子类化(除了使用AUTH_PROFILE_模块,但在这里没有帮助)。重要信息,这是Django最近的功能(版本1.9+)