在 Django 中,只允许管理员用户访问视图

Posted

技术标签:

【中文标题】在 Django 中,只允许管理员用户访问视图【英文标题】:In Django allow only admin user to access views 【发布时间】:2017-07-28 06:19:33 【问题描述】:

我在 Django 1.10 中有一个仪表板应用程序。我想将此应用程序的视图的访问权限仅限于管理员用户,如果用户未登录,则将他重定向到管理员的登录页面。

这是我想应用某种逻辑的地方,这样只有管理员用户才能看到以 /dashboard/ 开头的链接

url(r'^dashboard/', include('demo.dashboard.urls', namespace='dashboard'))

【问题讨论】:

【参考方案1】:

你应该使用user_passes_test装饰器:

def check_admin(user):
   return user.is_superuser

@user_passes_test(check_admin)
def my_view(request):
    ...

【讨论】:

如何在基于类的视图中做到这一点? 查看answer【参考方案2】:

您必须使用@login_required 装饰器或@staff_member_required 装饰器来装饰各个视图。正如文档所述,可能是后者:

如果您正在为 Django 的管理员编写自定义视图(或需要与内置视图相同的授权检查),您可能会发现 django.contrib.admin.views.decorators.staff_member_required() 装饰器是 login_required() 的有用替代品.

【讨论】:

我的仪表板有很多视图,大约 20-25,我是否需要在每个视图上应用装饰器。难道没有办法,让我可以在一个地方应用装饰器吗? 单独声明它们更符合pythonic。我们有大约 40 或 50 个自定义管理视图,这就是我们对待它们的方式。它们还具有独特的权限级别,因此每个视图都使用@staff_member_required 装饰器以及@superuser_required@permission_required('some_model.some_permission') 进行装饰。容易得多,而且我会更安全。 感谢您的建议。 再想一想:查看this example of applying a single decorator to many functions,我认为这可能正是您想要的。我怀疑关于修补globals() 的意见可能是混合的,但我说“去吧”。我的观点是,这就是我们使用 Python 的原因——因为我们可以让它为所欲为,就像在那个例子中一样。【参考方案3】:

我不确定 Django 1.10,但在 Django 3.0 中,您可以使用请求来检查用户是否是超级用户,也就是管理员。做吧:

def yourviewname(request):
    if request.user.is_superuser:
        #whatever_you_want_the_admin_to_see
    else:
        #forbidden

您还可以使用 django 附带的装饰器,例如 @staff_member_required@login_required

【讨论】:

以上是关于在 Django 中,只允许管理员用户访问视图的主要内容,如果未能解决你的问题,请参考以下文章

Django REST Framework 只允许超级用户访问 api web 视图

Sonata Admin - 只允许显示登录用户创建的内容

MVC 部分限制非管理员用户的视图访问

Django - Django ORM 如何管理用户在数据库中上传的表

django更改管理视图(无模型)

Django Admin Cookbook-19如何在管理后台中一个模型只允许创建一个对象