我有一个为网址'site / main /'定义的视图。我希望能够将(未经身份验证的)用户重定向到默认的“/ admin /”页面进行登录,然后在成功登录后重定向到“/ main /”页面。我按照django文档,但我必须遗漏一些东西,因为我无法让它工作。我的观点如下:
def main(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('admin/?next=%s' % request.path)
else:
我收到一个错误:
找不到页(404) 请求方法:GET 请求网址:http:// sitename:8080 / main / admin /?next = / main /
任何帮助是极大的赞赏 !
你错过了URL中的初始/
:/admin/?next=...
但是这仍然不起作用,因为admin
URL对next
参数一无所知。这仅适用于实际的登录视图。使用您的代码,用户将登录管理员,但不会被重定向回您的页面。
您应该构建一个登录模板并将其连接到内置的登录视图。然后,您应该只使用is_authenticated
装饰器,而不是在视图中检查login_required
。
@login_required
def main(request):
...
你的request.path
不应该是/main/
。没有第一个尝试它。
url('^', include('django.contrib.auth.urls')),
<h3>Login foo</h3>
<form method="post" action="">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Login">
</form>
它适用于Django 1.6并使用内置登录(查看urls.py)和模板。所以你不需要构建一个视图函数。
关于urls的信息
如果你想要redirect to admin for login
获取特定视图,然后在成功登录后再访问redirect back to the view url
,你只需要做两件事:
- 将
LOGIN_URL
添加到settings.py
内的django project module
:
...
LOGIN_URL = '/admin/login/'
- 将
@login_required
添加为views.py
中的视图函数的装饰器:
from django.contrib.auth.decorators import login_required
...
@login_required
def main(request):
一旦你设置了
LOGIN_URL = '/admin/login/'
,就可以在整个django项目中的任何@login_required
上使用view
,并将will redirect to admin for login
和after successful login will redirect back
用于视图网址。此外,现在你不需要在视图中使用
is_authenticated
了,就像Daniel Roseman已经说过的那样。好消息是,现在您还不需要构建登录模板并将其连接到内置登录视图。
这种方法的好处还在于您可以灵活地轻松地将此类身份验证添加或删除到您想要的任何视图。