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))
额外注意事项
- 确保Python脚本有可执行权限:
chmod +x /usr/lib/cgi-bin/load.py - 确认Apache已启用
mod_cgi模块,且cgi-bin目录的配置允许执行Python脚本。
内容的提问来源于stack exchange,提问作者ToniE
相关产品推荐
相关产品推荐

