我正在写一个Django网站。它几乎是一个只读站点,管理员除外,它对它执行一些更新操作。我希望管理员通过其前端编辑网站。
为了支持这一点,管理员会以不同的方式显示某些网址,除非请求来自登录的管理员,否则某些网址应返回404。
我宁愿不让管理员用户的存在对匿名用户特别明显,因此如果用户尚未以管理员身份登录,那么404仅用于管理员页面。
我此刻的设计是:
在服务器级别,有两个主机名作为同一个Django站点的别名:
在Django应用程序级别,对于管理员或管理员显示不同的每个视图,请检查请求的主机名是否为admin
。如果是:
拥有管理员可以手动登录的URL。
答案 0 :(得分:3)
在最简单的级别,您可以在管理员特定的视图中使用user_passes_test
装饰器:
@user_passes_test(lambda u: u.is_superuser)
def only_admins_here(request):
#do stuff
或者你可以简单地在视图中分支:
def some_view(request):
if request.user.is_superuser:
render_to_response('admin_template.html')
else:
render_to_response('template.html')
在这上面创建一个完整的子域层会很快变得非常复杂,因为并非Django中的所有类和函数都必须能够访问请求对象,因此请求来自哪个域。
答案 1 :(得分:1)
您可以删除第一点。
在Django应用程序级别,对于管理员或管理员显示的每个视图,检查请求是否来自登录管理员。