如何让Python Web脚本接收JSON输入并转为字典?
修改Web脚本接收JSON输入的方案
没问题,咱们来调整你的web.py代码,让它能接收并解析客户端发送的JSON请求体,同时还能兼顾原来的GET参数处理(如果需要的话)。这里是修改后的完整代码:
import os import sys import json from urllib.parse import parse_qsl def main(): # 初始化响应内容 response_content = {} try: # 获取请求方式,区分GET和POST request_method = os.environ.get("REQUEST_METHOD", "GET").upper() if request_method == "GET": # 保留原有GET参数处理逻辑 thestring = os.environ.get("QUERY_STRING", "") parameter_dict = dict(parse_qsl(thestring)) response_content = {"status": "success", "data": parameter_dict} elif request_method == "POST": # 处理POST类型的JSON请求 content_length = int(os.environ.get("CONTENT_LENGTH", 0)) # 从标准输入读取请求体数据 post_data = sys.stdin.read(content_length) # 解析JSON字符串为Python字典 parameter_dict = json.loads(post_data) response_content = {"status": "success", "data": parameter_dict} else: response_content = {"status": "error", "message": "不支持的请求方式"} except json.JSONDecodeError: response_content = {"status": "error", "message": "JSON格式无效"} except Exception as e: response_content = {"status": "error", "message": str(e)} # 返回JSON格式的响应(匹配客户端的解析逻辑) print("Content-Type: application/json; charset=utf-8") print("") print(json.dumps(response_content)) if __name__ == "__main__": main()
关键修改点说明:
- 读取POST请求体:在CGI环境中,POST数据是通过
sys.stdin传递的,我们需要先从环境变量CONTENT_LENGTH获取数据的字节长度,再读取对应长度的内容。 - JSON解析:用
json.loads()把读取到的字符串转成Python字典,这样你就能像使用GET参数字典一样直接操作它。 - 响应格式适配:因为你的客户端代码是用
json.loads()解析响应的,所以我们把响应内容也改成JSON格式,同时设置正确的Content-Type头。 - 异常防护:添加了JSON解析失败和通用异常的捕获,避免脚本崩溃,同时返回友好的错误提示。
- 兼容原有逻辑:保留了GET参数处理代码,让脚本可以同时支持两种请求方式。
现在运行修改后的web.py,再用你写的客户端代码发送请求,就能得到包含{"username":"user1", "folder":"folder1"}的响应数据了。
内容的提问来源于stack exchange,提问作者sniperd
相关产品推荐
相关产品推荐

