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

Ubuntu+Apache环境下Python接收XMLHttpRequest POST数据的问题

问题:XMLHttpRequest发送JSON POST到Apache CGI Python脚本触发500错误

场景与代码

需通过客户端JavaScript的XMLHttpRequest发送POST请求到Apache服务器cgi-bin目录下的Python3脚本,无法使用Form或Flask(需响应图表鼠标点击事件),服务器为Apache2而非Python自带Web服务器。

客户端代码

data.time = 3600;
var xhr = new XMLHttpRequest();
// 指定要发送数据的Python脚本
xhr.open("POST", "/cgi-bin/load.py", true);
xhr.setRequestHeader("Content-Type", "application/json");

// 此处为onreadystatechange函数(略)

// 注意:原代码缺少闭合括号,需修正
xhr.send(JSON.stringify(data));

服务器端原代码(报错版本)

#!/usr/bin/python3
import cgi, cgitb
import sys

form = cgi.FieldStorage()
print("Content-type:text/html\r\n\r\n")
print(" ")
print("Form=",form)

错误信息

运行后出现500内部服务器错误,Apache2错误日志显示:

File "/usr/lib/cgi-bin/load.py", line 8, in <module>
    form = cgi.FieldStorage()
  File "/usr/lib/python3.10/cgi.py", line 485, in __init__
    self.read_single()
  File "/usr/lib/python3.10/cgi.py", line 678, in read_single
    self.read_binary()
  File "/usr/lib/python3.10/cgi.py", line 700, in read_binary
    self.file.write(data)
TypeError: write() argument must be str, not bytes

问题原因

cgi.FieldStorage是专门用于处理表单类型数据(application/x-www-form-urlencoded或multipart/form-data)的工具,而你发送的是JSON格式数据(请求头Content-Type: application/json),cgi模块无法正确解析非表单类型的字节流数据,从而触发类型错误。

解决方法

直接从标准输入读取POST的JSON数据,无需使用cgi模块:

修改后的服务器端代码

#!/usr/bin/python3
import sys
import json

# 从标准输入读取POST的原始JSON数据
raw_data = sys.stdin.read()
try:
    # 解析为Python字典
    parsed_data = json.loads(raw_data)
except json.JSONDecodeError:
    # 处理JSON解析失败的情况
    parsed_data = {"status": "error", "message": "Invalid JSON format"}

# 设置响应头为JSON格式(更适合数据交互)
print("Content-Type: application/json\r\n\r\n")
# 将处理后的数据转为JSON字符串返回
print(json.dumps(parsed_data))

额外注意事项

  1. 确保Python脚本有可执行权限:
    chmod +x /usr/lib/cgi-bin/load.py
    
  2. 确认Apache已启用mod_cgi模块,且cgi-bin目录的配置允许执行Python脚本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:38:30