为什么第二个用户登录会将我重定向到/ accounts / profile / url?

时间:2012-11-01 22:48:49

标签: django django-authentication

我在视图中使用Django进行用户登录:

url(r'^user/login/$', 'django.contrib.auth.views.login', {'template_name': 'users/templates/login.html'}, name='user-login'),

登录后再次转到用户/登录我可以第二次登录。我提交表格并获得:

  

当前网址(accounts / profile /)与其中任何一个都不匹配。

我没有在urls.py声明此网址。

我做错了什么?为什么框架要重定向到此URL?

7 个答案:

答案 0 :(得分:71)

django.contrib.auth.views.login在您登录后立即将您重定向到accounts/profile/ 您可能希望将LOGIN_REDIRECT_URL文件中的settings.py设置为您喜欢的任何内容。

答案 1 :(得分:7)

Explained in doc

  

(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")