“ next”参数如何工作? Django身份验证系统

时间:2020-01-18 17:37:39

标签: django django-authentication

TLDR:<input type="hidden" name="next" value="{{ next }}">是我不明白的代码行。有了它,这个重定向系统就可以正常工作,但是,我不知道它在做什么。好像是在将用户链接到下一页,但实际上没有单击链接?

我了解到,如果未登录用户,则使用next参数将用户重定向到他们登录后尝试访问的任何装饰@login_required的视图。有点不可思议。

我具有以下与登录相关的设置:

LOGIN_REDIRECT_URL = 'dashboard' # tells django which url to redirect after login if no 'next' parameter is present in the request
LOGIN_URL = 'login' # url to redirect the user to log in (for example, views using the login_required decorator)

并且正在使用django.contrib.auth中提供的身份验证视图(为简单起见仅包括三个视图):

from django.urls import path
from . import views
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('', views.dashboard, name = 'dashboard'),
    path('login/', auth_views.LoginView.as_view(), name = 'login'),
    path('password_change/', auth_views.PasswordChangeView.as_view(), name = 'password_change'),
]

这是位于account / registration / index.html的自定义login.html模板:

  <div class="login-form">
    <form action="{% url 'login' %}" method="post">
      {{ form.as_p }}
      {% csrf_token %}
      <input type="hidden" name="next" value="{{ next }}">
      <input type="submit"  name="" value="Log-in">
    </form>
  </div>

现在说我尚未登录并尝试访问/account/password_change,将被重定向到login视图,并且路径将为http://127.0.0.1:8000/account/login/?next=/account/password_change/,登录后,我可以更改我的密码没有问题。但是,如果我从index.html中删除<input type="hidden" name="next" value="{{ next }}">

  <div class="login-form">
    <form action="{% url 'login' %}" method="post">
      {{ form.as_p }}
      {% csrf_token %}
      <input type="submit"  name="" value="Log-in">
    </form>
  </div>

,然后再次尝试访问/account/change_password(作为非登录用户),我将被重定向到登录页面,并且该URL与之前的http://127.0.0.1:8000/account/login/?next=/account/password_change/相同。但是,这次登录时,我被重定向到dashboard视图(这对我来说很有意义,我使用LOGIN_REDIRECT_URL = 'dashboard'定义了此视图,但未提供next参数。

说了这么多,我不明白的是为什么删除<input type="hidden" name="next" value="{{ next }}">之后是login视图下边http://127.0.0.1:8000/account/login/?next=/account/password_change/的路径(即使我将重定向到{{ 1}},而不是dashboard)?为什么将password_change添加回html之后,浏览器是否知道如何将用户重定向到正确的页面?

如果有人花时间阅读并回复此问题,请先感谢!

1 个答案:

答案 0 :(得分:1)

好问题。 请阅读此代码段 https://github.com/django/django/blob/master/django/contrib/auth/views.py#L71

如果您仔细观察,这行代码将尝试从POST获取数据,其名称为next。如果没有名为next的键,它将尝试从查询参数获取值;我是说GET。

因此,如果我们从表单(<input type="hidden" name="next" value="{{ next }}">)中删除输入,它仍然可以用作查询参数的备用。

希望,它会有所帮助。