如何在主要只读Django网站上最好地实现仅限管理员的页面和特定于管理员的视图?

时间:2011-06-13 16:11:24

标签: django

我正在写一个Django网站。它几乎是一个只读站点,管理员除外,它对它执行一些更新操作。我希望管理员通过其前端编辑网站。

为了支持这一点,管理员会以不同的方式显示某些网址,除非请求来自登录的管理员,否则某些网址应返回404。

我宁愿不让管理员用户的存在对匿名用户特别明显,因此如果用户尚未以管理员身份登录,那么404仅用于管理员页面。

我此刻的设计是:

  1. 在服务器级别,有两个主机名作为同一个Django站点的别名:

    • admin.example.com
    • www.example.com
  2. 在Django应用程序级别,对于管理员或管理员显示不同的每个视图,请检查请求的主机名是否为admin。如果是:

    • 如果请求来自登录管理员,则返回具有管理员特定显示的页面
    • 否则,返回404
  3. 拥有管理员可以手动登录的URL。

  4. 这是愚蠢的吗?我错过了更简单/更好的方法吗?

2 个答案:

答案 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)

您可以删除第一点。

  1. 在Django应用程序级别,对于管理员或管理员显示的每个视图,检查请求是否来自登录管理员。

    • 如果请求来自登录管理员,则返回具有管理员特定显示的页面
    • 否则,返回404
  2. 拥有管理员可以手动登录的URL。