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

如何在Python CGI脚本中接收JavaScript发送的POST请求?

解决Python CGI处理JSON格式POST请求的问题

1. 读取JSON格式的POST数据

cgi.FieldStorage()默认仅支持解析application/x-www-form-urlencoded或multipart/form-data类型的请求体,而你当前通过JS发送的是application/json格式,因此无法被自动解析。需要直接读取标准输入并手动解析JSON:

import json
import sys

# 读取POST请求的原始负载
raw_post_data = sys.stdin.read()
# 解析为JSON对象
try:
    post_data = json.loads(raw_post_data)
except json.JSONDecodeError:
    # 处理JSON解析失败的场景
    post_data = {}

2. 返回JSON格式的响应

要向客户端返回JSON,需先输出正确的HTTP响应头,再输出JSON字符串:

import json

# 设置响应头,告知客户端返回内容为JSON
print("Content-Type: application/json; charset=UTF-8")
print()  # 必须用空行分隔响应头与内容

# 构造响应字典
response = {
    "status": "success",
    "message": "数据已接收",
    "received": post_data
}
# 转为JSON字符串并输出
print(json.dumps(response))

3. 针对JavaScript代码的排查建议

你提到直接用HTML表单POST可正常工作,说明CGI脚本处理表单编码请求无问题,问题出在当前JS的JSON格式请求上,可从以下几点排查:

  • 先通过console.log(data)确认data变量的结构是否符合预期,避免存在格式错误的嵌套或值。
  • 打开浏览器开发者工具(F12)的Network标签,查看该POST请求的Request Body是否为合法JSON字符串,Headers中的Content-Type是否确实是application/json; charset=UTF-8。
  • 如果想继续使用cgi.FieldStorage()解析数据,可将JS请求体改为表单编码格式:
    // 将数据转为FormData(支持复杂数据,如文件)
    const formData = new FormData();
    for (const key in data) {
      formData.append(key, data[key]);
    }
    // 或用URLSearchParams(仅适合简单键值对)
    // const formData = new URLSearchParams(data);
    
    fetch('../../cgi-bin/saveFormAnswers.py', {
      method: 'POST',
      body: formData
      // 无需手动设置Content-Type,浏览器会自动添加正确的请求头
    })
    .then(antwoord => antwoord.json())
    .then(data => {
      console.log("Return data Python:")
      console.log(data);
    });
    
    这样修改后,Python端的cgi.FieldStorage()就能像处理表单POST一样正常读取数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:40:25