【问题标题】:Flask's redirect(url_for('profile')) only loads HTML on Console, but does not actually redirectFlask redirect(url_for('profile')) 仅在控制台上加载 HTML,但实际上并不重定向
【发布时间】:2017-10-29 07:41:33
【问题描述】:

我在我的 Flask 应用程序中使用 JavaScript 以透明的方式处理一些用户输入。我有以下途径来处理用户登录网站:

@app.route('/login/', methods=['GET', 'POST'])
def login_page():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        user = []
        user.append(float(request.form['orgid']))
        passwd = generate_password_hash(request.form['passwd'])
        user.append(passwd)
        pw_hash = cursor.callfunc("IRUD.READ_PASSWORD_HASH", cx_Oracle.STRING, user)
        if check_password_hash(pw_hash, request.form['passwd']):
            session['userid'] = cursor.callfunc("IRUD.READ_USER_ID", cx_Oracle.NUMBER, [float(request.form['orgid'])])
            return redirect(url_for('profile'))
        else:
            return redirect(url_for('login_error'))

在 login.html 中,用户填写一些信息进行登录,并使用 JavaScript 处理,代码如下:

$(document).ready(function(){
    $('#btnLogin').click(loginUser);
  });


function loginUser(){
    var oData={};
  oData.orgid=$('#matricula').val();
  oData.passwd=$('#passwd').val();

  $.ajax({
    url: '/login/',
    data: oData,
    type: 'POST',
    success: function(response){
      console.log('Success - Login!');
      console.log(response);
    },
    error: function(error){
      console.log('Error - Login!');
      console.log(error);
    }
  });

如果登录成功,我应该被重定向到一个由 profile() 方法处理的 URL /profile。然而,这个页面的 HTML 显示在我的网络浏览器的控制台中,根本没有重定向。

我在这个网站上阅读了一些关于它与使用 jQuery 的关系的帖子,但是,我还没有找到解决我问题的答案。

成功登录后,如何正确地将我的用户重定向到另一个网页?

感谢您提供的任何帮助。

更新

值得注意的是,如果我将return redirect(url_for('profile')) 更改为更简单的return render_template('profile.html'),HTML 仍然只是在控制台中加载。

更新 2

另外,我认为另一种选择是仅使用 Flask 处理所有此页面,而无需任何 JavaScript 控制器。我的 Python 代码现在看起来像这样:

@app.route('/login/', methods=['GET', 'POST'])
def login_page():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        user = []
        user.append(float(request.form['orgid']))
        passwd = generate_password_hash(request.form['passwd'])
        user.append(passwd)
        pw_hash = cursor.callfunc("IRUD.READ_PASSWORD_HASH", cx_Oracle.STRING, user)
        if check_password_hash(pw_hash, request.form['passwd']):
            session['userid'] = cursor.callfunc("IRUD.READ_USER_ID", cx_Oracle.NUMBER, [float(request.form['orgid'])])
            return render_template('profile.html', name=session['userid'])
        else:
            return render_template('error.html')

但是,当我这样做时,我遇到了以下错误: POST http://127.0.0.1:5000/login/ 400 (BAD REQUEST)

【问题讨论】:

  • 当您收到400 (BAD REQUEST) 时,flask 是否在控制台上记录任何错误?如果没有,请尝试通过设置app.debug = True 以调试模式运行,其中 app 是您的 Flask 对象。
  • @PrahladYeri,我确实有 debug = True,但我没有得到任何其他详细信息。但是,我刚刚检查过:这与 Flask 如何使用 name 属性而 JavaScript 使用 id 获取 HTML 元素的值有关。
  • 当然,这就是为什么你必须在你的html输入标签中设置name='matricula'id='matricula'(这样JavaScript和后端Flask应用程序都可以破译它。你确定你在做那个?
  • 另外,请确保为 float(request.form['orgid'] 之类的值运行打印语句,这样您就知道后端实际得到了什么。

标签: javascript jquery python redirect flask


【解决方案1】:
from flask import jsonify
if check_password_hash(pw_hash, request.form['passwd']):
        return jsonify(dict(redirect='profile.html', name=session['userid']))
    else:
        return jsonify(dict(redirect='error.html'))

然后在你的 Javascript 文件中:

success: function(response) {
    if (response.redirect){
        window.location.href = response.redirect;
      }
   }

我遇到了同样的问题,这是我找到的解决方案。我认为它可以优化。

【讨论】:

    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 2010-12-04
    • 2018-09-05
    • 2021-04-23
    • 2022-12-11
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多