如何在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请求体改为表单编码格式:
这样修改后,Python端的// 将数据转为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); });cgi.FieldStorage()就能像处理表单POST一样正常读取数据。
内容的提问来源于stack exchange,提问作者Mr_BananaPants
相关产品推荐
相关产品推荐

