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+)