为什么在Django中,第二个用户登录会将我重定向到/accounts/profile/的URL?

47
我正在使用Django内置的用户登录视图:
url(r'^user/login/$', 'django.contrib.auth.views.login', {'template_name': 'users/templates/login.html'}, name='user-login'),

登录后,当我再次访问用户/登录时,我可以第二次登录。我提交表单后得到以下信息:
当前的URL,accounts/profile/,与任何URL都不匹配。
我没有在urls.py中声明这个URL。
我做错了什么?为什么框架要重定向到这个URL?
7个回答

108

django.contrib.auth.views.login登录后会将用户重定向到accounts/profile/
您可能想在settings.py文件中设置LOGIN_REDIRECT_URL以任何你喜欢的URL。


8
没问题,虽然将重定向到不存在的地方编码有些奇怪,但这是正确的。将重定向到'/'会更合理一些吧? - Rob Grant
1
工作得很好。将文本“LOGIN_REDIRECT_URL =('..')”添加到settings.py中,可以将用户重定向回默认的主页。 - Praxiteles
1
这个页面无法正常工作,本地主机重定向次数过多。 - Ishan Srivastava

8

在文档中有解释

(accounts/profile/ 是 ...) 当 contrib.auth.login 视图没有 next 参数时,请求登录后重定向的 URL。

因为您尚未验证身份,所以请求将被重定向到此 URL。为了避免重定向,您应该在将用户发送到 user/login 之前注销用户,创建自定义登录视图或添加 Next 参数


3
请检查你的 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>

祝你好运~


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..
    }
}

0
默认情况下,'/accounts/login/' 被设置为 LOGIN_REDIRECT_URL,即登录后重定向的路径。
例如,您可以在 settings.py 中将 Django 管理页面设置为 LOGIN_REDIRECT_URL,如下所示,以在登录后重定向到该页面:
# "settings.py"

LOGIN_REDIRECT_URL = 'admin:index'

或者:

# "settings.py"

LOGIN_REDIRECT_URL = '/admin/'

0
当您使用 Django 中内置的视图构建,并成功登录时,django.contrib.auth.views.login 是您使用的 Django 视图。
它内部有一个称为 LOGIN_REDIRECT_URL 的参数,在成功登录后自动重定向您。默认情况下配置为 Default: '/accounts/profile/'。
文档说:如果 LoginView 没有得到 next GET 参数,则请求在登录后重定向到 URL 或命名的 URL 模式。

https://docs.djangoproject.com/en/3.1/ref/settings/#std:setting-LOGIN_REDIRECT_URL

尝试将此代码添加到您用于登录的HTML页面表单中。

-1

有两种方法,一种是使用logout "LOGIN_REDIRECT_URL",或者

直接使用重定向到具有@login_required装饰器的视图方法的URL

例如

对于第二次登录,在注销后(下面的代码在logout.html中)

<a href ="/">Login again </a>

In views.py

@login_required
def home(request):
  return HttpResponse("Welcome")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接