【问题标题】:flask not providing results to ajax call烧瓶没有为ajax调用提供结果
【发布时间】:2021-12-14 18:45:34
【问题描述】:

我正在对烧瓶函数进行 ajax 调用,以使用以下令牌获取数据

@app.route("/questgen/results", methods = ['POST', 'GET'])
def fetch_results():

    token = request.form.get('token')
    print(token)
    conn = sqlite3.connect("database.db" , timeout=20)
    cur= conn.cursor()
    select_query = '''SELECT processed, output_text 
                    FROM results 
                    WHERE token = token 
                    '''
    cur.execute(select_query)
    records = cur.fetchall()
    processed = ""
    html = ""
    for row in records:
        processed = row[0]
        html = row[1]
    conn.close()
    data = {'processed': processed, 'html' : html}
    

    return redirect(url_for('questgen', data = data))

ajax调用如下

        $.ajax({
            type: "POST",
            url: "/questgen/results",
            data: { token: token },
            datatype: "json",
            success: function (data) {
                if (data.processed == 1) {
                    $('#divresults').html(data.html);
                    $('#divresults').show();
                    hideMyModal();
                    clearInterval(saveInterval);
                }
            }
        });

完整的有点长,可以在这个gist找到问题是它返回

TypeError:视图函数未返回有效响应。这 函数要么返回 None,要么在没有 return 语句的情况下结束。

即使我通过在同一个数据库上使用return data 尝试了与 python 函数相同的烧瓶函数并且它可以工作。我什至尝试将token 作为函数参数,但它仍然无法正常工作。有人可以帮助我在这里做错什么吗?谢谢

【问题讨论】:

  • 你能解释一下你为什么这样做`data_str = json.dumps(data_dict) data = json.loads(data_str)`
  • render_template('questgen.html', data = data) 为我工作。你能详细说明你的答案吗?因为我的应用程序中有其他函数使用redirect 并返回数据
  • 我需要两个变量的 json 对象
  • 你有一个 dict data_dict 你把它转成 str 再转回 dict - 不是吗?
  • 我删除了我的第一条评论,因为我走错了路。您的render_template 解决方案是处理此问题的正确方法。 @balderman 是对的:datadata_dict 完全相同。转换为 JSON 并返回是没有意义的。

标签: python html ajax sqlite


【解决方案1】:

jQuery ajax 调用不会自动处理重定向。您只会收到带有 301 或 302 状态代码的响应。如果确实需要重定向,则需要检查 302 状态返回并使用更改的数据再次调用。如果您可以通过调用其他函数在内部进行重定向会更好。

【讨论】:

    【解决方案2】:

    尝试jsonify返回数据

    from flask import Flask, jsonify, request #import this 
    

    然后用这个返回数据

    return jsonify({"res": data})
    

    在 ajax 中,您将在 res 中获取数据

    console.log(data.res) // your data
    console.log(data.res.processed) // your if condition
    

    还要检查是否需要解析响应正文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2020-04-27
      相关资源
      最近更新 更多