Django - 某些视图的用户权限?

时间:2011-01-04 19:11:36

标签: python django django-authentication django-permissions django-login

从管理员我看到您可以为用户或用户组分配权限,以便:允许添加,更改或删除模型中的数据。

这很好,但我还需要允许用户或用户组访问或不访问一组视图。我在我的网站上有某种类型的服务,所以我想允许一些用户访问某些服务(页面/视图)而不是其他用户。

那么我如何允许某些用户/用户组访问某些视图?谢谢!

5 个答案:

答案 0 :(得分:23)

无法添加或更改某个型号的用户将无法在管理员中看到它。

如果我们谈论您自定义创建的视图,那么您可以创建一些检查用户权限的内容,如果他们没有该权限则返回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):
    # ...

使用权限,您只需使用管理界面即可轻松地在用户和组中添加或删除权限。

答案 1 :(得分:10)

您需要手动管理,但这很容易。据推测,有一个属性可以确定一个组是否有权查看视图:那么您只需使用permission_required装饰器装饰该视图,如果这是一个关于用户是否具有特定权限的简单问题,或者{ {1}}如果它有点复杂:

user_passes_test

假设@user_passes_test(lambda u: u.is_allowed_to_see_view_myview()) def myview(request): ...etc... 是User对象上的某种方法。

authentication docs非常全面。

答案 2 :(得分:2)

对于基于类的视图,您可以将UserPassesTestMixin类继承到视图中并定义test_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')

请查看this docs了解有关如何使用此功能的更多详细信息:

答案 3 :(得分:1)

权限系统以模型为中心,并假定权限与模型相关联。我认为以下两种选择是最好的选择:

一个。如果您的视图与某些特定模型相关,请使用该模型的自定义权限,如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向数据库添加自定义权限。

答案 4 :(得分:0)

如果您使用的是Django 1.9+,则应该可以使用Option Explicit Sub CompareIt() Dim ar As Variant Dim arr As Variant Dim Var As Variant Dim v() Dim i As Long Dim n As Long Dim j As Long Dim str As String ar = Sheet1.Cells(10, 1).CurrentRegion.Value With CreateObject("Scripting.Dictionary") .CompareMode = 1 ReDim v(1 To UBound(ar, 2)) For i = 2 To UBound(ar, 1) For n = 1 To UBound(ar, 2) str = str & Chr(2) & ar(i, n) v(n) = ar(i, n) Next .Item(str) = v: str = "" Next ar = Sheet2.Cells(10, 1).CurrentRegion.Resize(, UBound(v)).Value For i = 2 To UBound(ar, 1) For n = 1 To UBound(ar, 2) str = str & Chr(2) & ar(i, n) v(n) = ar(i, n) Next If .exists(str) Then .Item(str) = Empty Else .Item(str) = v End If str = "" Next For Each arr In .keys If IsEmpty(.Item(arr)) Then .Remove arr Next Var = .items: j = .Count End With With Sheet3.Range("a10").Resize(, UBound(ar, 2)) .CurrentRegion.ClearContents .Value = ar If j > 0 Then .Offset(1).Resize(j).Value = Application.Transpose(Application.Transpose(Var)) End If End With Sheet3.Activate End Sub https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.mixins.PermissionRequiredMixin