Как работает параметр «следующий»? Django система аутентификации - PullRequest
0 голосов
/ 18 января 2020

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'),
]

Вот пользовательский логин. html tempate, расположенный в учетной записи / регистрации / индексе. 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/, после входа я могу сменить пароль без проблем. Однако, если я удаляю <input type="hidden" name="next" value="{{ next }}"> из индекса. html:

  <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/ (хотя я буду перенаправлен на dashboard, а не password_change)? И почему после добавления <input type="hidden" name="next" value="{{ next }}"> вернуться к html знает ли браузер, как перенаправить пользователя на нужную страницу?

Если кто-то найдет время, чтобы прочитать и ответить на это, заранее спасибо!

1 Ответ

1 голос
/ 22 января 2020

Хороший вопрос. Пожалуйста, прочтите этот сегмент кода https://github.com/django/django/blob/master/django/contrib/auth/views.py#L71

Если вы внимательно наблюдаете, эта строка кода пытается получить данные из POST как имя next. Если нет ключа с именем next, он пытается получить значение из параметра запроса; Я имею в виду ПОЛУЧИТЬ.

Итак, если мы удаляем ввод из формы (<input type="hidden" name="next" value="{{ next }}">), он все равно работает, поскольку параметры запроса действуют как запасной вариант.

Надеюсь, это поможет.

...