有关处理“下一个”URL的文档Flask-login。这个想法似乎是:如何通过使用Flask和Flask登录的“下一个”URL?
- 用户进入
/some-secret-URL
- 用户被重定向到登录页面(如
/login
) - 成功登录后,用户被重定向回
/some-secret-URL
我找到的唯一使用Flask登录的半完整示例是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 />
现在,当用户访问/some-secret-URL
,他被转到/login?next=%2Fsecret
。到目前为止,这么好 - 查询字符串中的“next”参数。
但是,当用户提交登录表单时,他将被重定向回索引页面,而不是返回到/secret
URL。
我猜的原因是因为传入网址上可用的“下一个”参数没有合并到登录表单中,因此在处理表单时没有作为变量传递。 ?解决这个正确的方式
一个解决方案似乎工作 - 从
<form name="loginform" action="{{ url_for('login') }}" method="POST">
的<form>
标签更改为:
<form name="loginform" method="POST">
删除“action”属性后,浏览器(至少Windows上的Firefox 45)会自动使用当前URL,使其继承?next=%2Fsecret
查询字符串,该查询字符串已成功将其发送到表单处理处理程序。
但省略了“action”表单属性并让浏览器将其填充到正确的解决方案中吗?它是否适用于所有浏览器和平台?
或者Flask或Flask-login打算以不同的方式处理它?
当你把'action =“{{url_for('login')}}”'的HTML源代码输出到底是什么? –
http://flask.pocoo.org/snippets/63/ – davidism
@K DawG,它是'