1

我正在@login_required为我的应用程序中的某些路线使用 Flask-login 的装饰器。在未登录的情况下导航到这些路线时,我被重定向到登录页面。到现在为止还挺好。

重定向的 url 看起来像这样:/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)

在此先感谢您的帮助。

4

4 回答 4

3

我想通了,导航到受登录保护的路由(本例中为 /requests)会导致重定向到带有next参数的登录页面。

/login?next=%2Frequests  

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

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

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

<form action="{{ url_for('login', next=next) }}" method='POST'>
于 2013-12-25T00:01:48.010 回答
0

干得好:

import urllib


@app.route('/login')
def login():
    error = None
    next = urllib.unquote_plus(request.args.get('next'))
    ...
于 2013-12-23T07:51:53.080 回答
0

如果有人像我一样发现这个问题,这里是对我有用的实现。问题是登录的 POST 表单只进入 /login,导致下一个 URL 被丢弃。按照 Kevan 的建议,如果您添加next=request.args.get('next'))到登录表单的操作,它将传递下一个参数。

在我的登录功能中

@app.route('/login', methods = ['GET', 'POST'])
def login():
    next = request.args.get('next')
    if request.method == 'POST':
        ...Confirm User...
            if next:
                return redirect(next)
            else:
                return redirect('/')

在我的登录表单中

<form method="post" action="{{ url_for('login', next=request.args.get('next')) }}" enctype="multipart/form-data">
于 2014-03-31T19:49:51.043 回答
0

出于安全原因,应考虑检查下一个参数,如建议

https://flask-login.readthedocs.io/en/latest/#login-example

@app.route('/login', methods=['GET', 'POST'])
  def login():
    # Here we use a class of some kind to represent and validate our
    # client-side form data. For example, WTForms is a library that will
    # handle this for us, and we use a custom LoginForm to validate.
    form = LoginForm()
    if form.validate_on_submit():
        # Login and validate the user.
        # user should be an instance of your `User` class
       login_user(user)

       flask.flash('Logged in successfully.')

       next = flask.request.args.get('next')
       # is_safe_url should check if the url is safe for redirects.
       # See http://flask.pocoo.org/snippets/62/ for an example.
       if not is_safe_url(next):
           return flask.abort(400)

     return flask.redirect(next or flask.url_for('index'))
  return flask.render_template('login.html', form=form)
于 2019-12-02T02:09:05.500 回答