python - login_required 编码下一个参数,重定向失败

标签 python redirect flask flask-login login-required

我正在为我的应用程序中的某些路由使用 Flask-login 的 @login_required 装饰器。在未登录的情况下导航到这些路线时,我会被重定向到登录页面。到目前为止一切顺利。

重定向的网址如下所示:/login?next=%2Fusers
看起来它对下一个参数进行了 url 编码,这是我在遇到的示例中没有看到的。登录后,重定向回 next 总是失败并回退到索引页面。我认为这是因为 next 是 url 编码的。

我应该以不同的方式解决这个问题吗?我刚刚开始深入研究 Flask 框架并研究示例,所以我不太了解做事的最佳方法。

这是一个示例路线:

login_manager.login_view = 'login'

@app.route('users')  
@login_required  
def users():  
  return 'Test'

我的登录路线如下所示:

@app.route('/login')
def login():
  error = None
  next = request.args.get('next')
  if request.method == 'POST':
    username = request.form['username']
    password = request.form['password']

    if authenticate_user(username, password):
      user = User.query.filter_by(username=username).first()
      if login_user(user):
        flash("You have logged in")
        session['logged_in'] = True
        return redirect(next or url_for('index', error=error))
    error = "Login failed"
  return render_template('login.html', login=True, next=next, error=error)

预先感谢您的帮助。

最佳答案

我发现,导航到受登录保护的路由(本例中为/requests)将导致使用 next 参数重定向到登录页面。

/login?next=%2Frequests  

在我的登录模板中,我有这个:

<form action="{{ url_for('login') }}" method='POST'>

这导致表单在没有任何参数的情况下被发布到 /login 路由。删除 action 属性或将其更改为 action="" 会导致表单发布到其自己的 url,其中包括原始查询字符串。另一种选择是在 url_for 中包含 next=next

<form action="{{ url_for('login', next=next) }}" method='POST'>

关于python - login_required 编码下一个参数,重定向失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737167/

相关文章:

python - 使用字典在列表中查找加起来等于和的一对元素

bash - 如何重定向写入 tty 的程序?

javascript - 如何在 URL 中传递值并在新 URL 中插入值以使用 Javascript 进行重定向?

PythonAnywhere 试图上传我的网站

python - 运行 "KeyError: <flask.cli.ScriptInfo object at 0x0000000003C05B70>"时得到 "flask db init"

python - 在 Flask 应用程序中重用样板代码

Python通过特定方程列出交叉识别(重叠?)

python - 扁平化浅层嵌套列表的习语 : how does it work?

python - 有没有什么好的方法或者插件可以很方便的在vim中走到python某个函数的结尾

javascript - 单击“重新加载”图标还是单击“F5”?重定向到另一个页面