在 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 视图