我在视图中使用Django进行用户登录:
url(r'^user/login/$', 'django.contrib.auth.views.login', {'template_name': 'users/templates/login.html'}, name='user-login'),
登录后再次转到用户/登录我可以第二次登录。我提交表格并获得:
当前网址(accounts / profile /)与其中任何一个都不匹配。
我没有在urls.py
声明此网址。
我做错了什么?为什么框架要重定向到此URL?
答案 0 :(得分:71)
django.contrib.auth.views.login
在您登录后立即将您重定向到accounts/profile/
您可能希望将LOGIN_REDIRECT_URL
文件中的settings.py
设置为您喜欢的任何内容。
答案 1 :(得分:7)
(accounts / profile / is ...)登录后重定向请求的URL contrib.auth.login视图没有下一个参数。
由于您尚未通过身份验证,因此您的请求会重定向到此网址。为避免重定向,您应先退出用户,然后再将其发送至user/login
,创建自定义登录视图或append Next parameter。
答案 2 :(得分:4)
@CpS提供了非常好的解决方案,我只想稍微增强一点:
例如,您有以下网址:
urlpatterns = [
# django's login/logout
url(r'login/$', 'django.contrib.auth.views.login', name='login'),
url(r'logout/$', 'django.contrib.auth.views.logout', name='logout'),
url(r'logout-then-login/$', 'django.contrib.auth.views.logout_then_login', name='logout_then_login'),
url(r'^$', views.dashboard, name='dashboard')
]
成功登录后,和dashboard.html
是您要重定向的位置,然后您可以相应地修改settings.py
文件:
from django.core.urlresolvers import reverse_lazy
LOGIN_REDIRECT_URL=reverse_lazy('dashboard')
LOGIN_URL=reverse_lazy('login')
LOGOUT_URL=reverse_lazy('logout')
我们正在使用reverse_lazy()
动态构建网址。 reverse_lazy()
功能会像reverse()
那样反转网址,但您可以在需要在加载项目的网址配置之前反转网址时使用它。
答案 3 :(得分:2)
检查您的login.html
<form method="post" action=".">
~blah~
<input type="hidden" name="next" value="/"><!-- login.html must send "next" parameter, and "next" parameter value is url that you want to redirect. -->
~blah~
</form>
祝你好运〜
答案 4 :(得分:1)
所有这一切对我都不起作用。我使用了JavaScript解决方案:
在login.html(社交登录按钮所在的位置)中,我将此脚本存储在本地存储中::
<script>
// Check for local storage
if (typeof(Storage) !== "undefined") {
var h = window.location.href;
if (h.indexOf("next") > 0){
var tokens = h.split("=");
var nextUrl = tokens[1];
for(i = 2;i< tokens.length;i++){
nextUrl += ("=" + tokens[i]);
}
localStorage.setItem("next",nextUrl);
}
}
</script>
在用户被重定向到的页面中,我使用以下脚本重定向:
$(document).ready(function () {
// Check for local storage
if (typeof(Storage) !== "undefined") {
var nextUrl = localStorage.getItem("next");
if (nextUrl.length > 0){
localStorage.setItem("next","");
window.location = nextUrl;
}
}
else {
// Sorry! No web storage support..
}
}
答案 5 :(得分:0)
当您在 Django 中使用视图构建时。然后你就登录成功了。django.contrib.auth.views.login 就是你使用的django视图。
它包含一个名为 LOGIN_REDIRECT_URL 的参数,它会在登录后自动重定向您。默认情况下配置为 Default:'/accounts/profile/'。
wich 是 URL 或命名 URL 模式,当 LoginView 没有获得下一个 GET 参数时,请求在登录后重定向。说文档
https://docs.djangoproject.com/en/3.1/ref/settings/#std:setting-LOGIN_REDIRECT_URL
尝试将其添加到您用于登录的 html 页面表单中。
答案 6 :(得分:-1)
两种方式,您可以使用注销“ LOGIN_REDIRECT_URL”或
只需使用重定向到具有@login_required装饰器的view方法的url
示例
注销后进行第二次登录(以下代码位于logout.html中)
<a href ="/">Login again </a>
在views.py
@login_required
def home(request):
return HttpResponse("Welcome")