我为网址'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 /
非常感谢任何帮助!
答案 0 :(得分:5)
您错过了网址中的初始/
:/admin/?next=...
然而,这仍然无效,因为admin
网址对next
参数一无所知。这仅适用于实际的登录视图。使用您的代码,用户将登录管理员,但不会被重定向回您的页面。
您应该构建一个登录模板并将其连接到内置的登录视图。然后,您应该只使用is_authenticated
装饰器,而不是在视图中检查login_required
。
@login_required
def main(request):
...
答案 1 :(得分:2)
您的request.path
不应该是/main/
。没有第一个就试试吧。
答案 2 :(得分:1)
urls.py:
url('^', include('django.contrib.auth.urls')),
登记/ login HTML:
<h3>Login foo</h3>
<form method="post" action="">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Login">
</form>
&#13;
views.py
def only_for_users(request): 如果不是request.user.is_authenticated(): 返回HttpResponseRedirect(&#39; / login /?next =%s&#39;%request.path)
//获取一些非常有趣的数据
ENV =(django.get_version(),settings.BASE_DIR,内容sys.version) envMod = collections.OrderedDict(排序(sys.modules.items())) return render(request,&#39; env.html&#39;,{&#39; env&#39;:env,&#39; envMod&#39;:envMod})
适用于Django 1.6并使用内置登录(查看urls.py)和模板。所以你不需要构建一个视图函数。
上的信息答案 3 :(得分:0)
如果要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
用于视图URL。现在,您也不需要像 Daniel Roseman 所说的那样在视图内部使用
is_authenticated
。好处是,现在您也不需要来构建登录模板并将其连接到内置登录视图。
此方法的优点还在于您具有灵活性,可以轻松地将这种身份验证添加或删除到所需的任何视图。