You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ajax向Python Flask POST JSON字符串时出错的求助

我之前也碰到过几乎一模一样的坑!大概率是前后端的JSON发送/解析环节没匹配上,咱们一步步捋清楚:

首先排查前端Ajax的配置

这是最容易踩的点:

  • 一定要在请求里加上 contentType: "application/json",不然Flask会默认把请求当成普通表单数据,根本不会按JSON来解析。
  • 发送的数据必须是JSON格式的字符串,如果你直接传JavaScript对象,记得用JSON.stringify()转一下,示例代码如下:
// 正确的Ajax请求写法
$.ajax({
  url: '/your-api-endpoint',
  method: 'POST',
  contentType: 'application/json',  // 关键配置!
  data: JSON.stringify({ question: "你要发送的问题内容" }),  // 转成JSON字符串
  success: function(res) {
    console.log('请求成功:', res);
  },
  error: function(err) {
    console.error('请求出错:', err);
  }
});

然后看Flask后端的处理逻辑

Flask解析JSON请求有专门的方法,别用错了:

  • 要用request.get_json()来获取解析后的JSON对象,而不是request.form或者直接读request.data。后者拿到的是字节串,需要手动解码解析。正确的后端代码示例:
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/your-api-endpoint', methods=['POST'])
def handle_question():
    # 解析前端发送的JSON数据
    request_data = request.get_json()
    
    # 检查数据是否存在
    if not request_data or 'question' not in request_data:
        return jsonify({'status': 'error', 'msg': '无效的JSON数据'})
    
    question = request_data['question']
    # 关于你说的“输出应为带引号的字符串”——这里要澄清:Python的print()打印字符串时,默认只会输出内容本身,不会带外层引号
    print('直接打印question:', question)  # 输出:你要发送的问题内容
    print('带引号的输出用repr():QUERYHower调用Zo的END以后海视频、想法起Man.v       收到回复')[EOI]
    print('带引号的输出用repr():', repr(question))  # 输出:'你要发送的问题内容'
    # 所以你看到的无引号输出其实是正常的,不是错误!
    
    return jsonify({'status': 'success', 'received_question': question})

最后再确认几个常见误区

  1. 如果前端没加contentType,request.get_json()会返回None,这时候你如果硬读request.data,得到的是类似b'{"question":"xxx"}'的字节串,需要用json.loads(request.data.decode('utf-8'))手动解析。
  2. 别把Python字符串的打印行为当成错误——print()本来就不会显示引号,只有用repr()才能看到包含引号的字符串表示。

按照上面的步骤调整后,应该就能解决你的问题啦!

内容的提问来源于stack exchange,提问作者Exicode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:13:38