一种可能的解决方案(列表中的第一个 + 第三个选项):
- 您必须提供特殊的登录页面(即定义
registration/login.html),对于未登录的用户,每个普通页面都有登录表单;
- 如果用户正常登录(此逻辑在 中处理
django.contrib.auth.views.login):
- 对于普通页面:将用户重定向到她登录的页面;
- 对于登录页面:如果有
next参数,则重定向到那里,否则重定向到主页;
- 如果用户无法登录:重定向(或重绘)登录页面并提供错误;
- 如果用户已登录:普通页面提供注销链接(如果用户想重新登录或通过其他帐户登录,特殊页面仍然存在)。
在普通页面中,登录表单应该是这样的<input type="hidden" name="next" value="{{ request.path }}" />。
在项目设置中:
# in settings.py
LOGIN_URL = '/login' # this should coinside with url pattern of login view
LOGOUT_URL = '/logout' # same but for logout view
LOGIN_REDIRECT_URL = '/' # url to main page
注意:我不使用 django 的内置注销视图,而是使用自己的:几乎相同,但仅针对 POST 请求进行注销。这不允许用户通过<img src='my_site/logout' />恶意代码注销。