В документации для Flask-login говорится об обработке «следующего» URL-адреса. Идея вроде бы такая:
- Пользователь переходит к
/secret
- Пользователь перенаправляется на страницу входа (например,
/login
) - После успешного входа пользователь перенаправляется обратно на
/secret
Единственный наполовину полный пример использования Flask-login, который я нашел, - это https://gist.github.com/bkdinoop/6698956. Это полезно, но, поскольку в него не входят файлы шаблонов HTML, я смотрю, смогу ли я воссоздать их в качестве упражнения для самообучения.
Вот упрощенная версия раздела /secret
и /login
:
@app.route("/secret")
@fresh_login_required
def secret():
return render_template("secret.html")
@app.route("/login", methods=["GET", "POST"])
def login():
<...login-checking code omitted...>
if user_is_logged_in:
flash("Logged in!")
return redirect(request.args.get("next") or url_for("index"))
else:
flash("Sorry, but you could not log in.")
return render_template("login.html")
А вот login.html
:
<form name="loginform" action="{{ url_for('login') }}" method="POST">
Username: <input type="text" name="username" size="30" /><br />
Password: <input type="password" name="password" size="30" /><br />
<input type="submit" value="Login" /><br />
Теперь, когда пользователь посещает /secret
, он перенаправляется на /login?next=%2Fsecret
. Пока все хорошо - параметр «следующий» находится в строке запроса.
Однако, когда пользователь отправляет форму входа, он перенаправляется обратно на страницу индекса, а не обратно на /secret
URL.
Я предполагаю, что причина в том, что параметр "next", который был доступен во входящем URL-адресе, не включен в форму входа и поэтому не передается как переменная при обработке формы. Но как правильно решить это?
Кажется, работает одно решение - измените тег <form>
с
<form name="loginform" action="{{ url_for('login') }}" method="POST">
to:
<form name="loginform" method="POST">
После удаления атрибута «действие» браузер (по крайней мере, Firefox 45 в Windows) автоматически использует текущий URL-адрес, заставляя его наследовать строку запроса ?next=%2Fsecret
, которая успешно отправляет ее обработчику обработки формы.
Но является ли опускание атрибута формы "действие" и позволяет браузеру заполнить его правильным решением? Работает ли он во всех браузерах и на всех платформах?
Или Flask или Flask-login намереваются обработать это по-другому?