【发布时间】:2021-05-01 13:46:07
【问题描述】:
我正在尝试从本地 Apache 服务器 (xampp) 上运行的 Python CGI 脚本返回 JSON 数据。
脚本本身运行良好,没有任何问题,并且返回了预期的结果,尽管脚本输出了标头
print("Content-type: application/json; charset: utf-8")
当向同一脚本发出 AJAX 请求(从客户端 javascript)时,请求会失败。运行后
#!C:\Python39\python.exe -u
import cgi
cgi.test()
exit(0)
原来Shell Environment:部分下接受的响应头如下
HTTP_ACCEPT
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
这会导致 JSON 响应以 HTML 格式发送,从而中断请求,因为响应以 JSON 格式发送,但请求仅接受 HTML 响应。
我尝试通过在 /cgi-bin 目录中的 .htaccess 文件中添加接受的 MIME 类型
来解决此问题AddType application/json .py
但这不起作用,我不希望强制将我的 .py 脚本解释为 .json 文件成为所需的解决方案,因为我希望输出为 JSON,而不是文件本身。
Apache 文档here 声称可以发送非 html 内容,但它没有给出如何完成此操作的示例。
我的项目中也有许多 PHP 文件(在 /htdocs 中),它们执行完全相同的操作(输出通过外部 AJAX 请求访问的 JSON 响应),但不仅仅是输出脚本中的 JSON 标头,它们不需要对服务器接受的输出进行任何修改,并且无需任何进一步干预即可正常工作。
我似乎找不到任何其他与强制服务器响应 JSON 数据而不是 CGI 脚本的 HTML 文本相关的解决方案。
【问题讨论】:
-
尽管 XML 是接受输出的默认格式之一,但由于明显的安全漏洞,我不想使用 Python 的 XML 库,也不想使用 PHP 中的 cURL 等额外开销运行 CGI 脚本,然后从 CGI 脚本生成的 html/xml 中提取数据,然后通过 PHP 脚本将该数据输出为 JSON。但是,如果其他方法都失败了,这似乎是我能想到的仅有的两种解决方法。
标签: python json ajax apache cgi