如何从Python字典列表构造可直接使用的GraphQL调用字符串
问题场景
你在使用Python requests 库发起GraphQL mutation请求时,需要将Python字典列表序列化为键名不带双引号的GraphQL兼容格式字符串,当前逐字段替换的方式可运行但扩展性差。
可选优化方案
无依赖通用序列化方法
不需要安装额外第三方库,也不需要逐字段写替换规则,写一个简单的递归序列化函数即可适配任意结构的字典列表,自动移除键名两侧的双引号,值部分保留标准JSON格式保证类型正确:
import json def serialize_graphql_input(data): if isinstance(data, list): serialized_items = [serialize_graphql_input(item) for item in data] return f"[{', '.join(serialized_items)}]" elif isinstance(data, dict): serialized_kv = [] for key, value in data.items(): serialized_kv.append(f"{key}: {json.dumps(value)}") return f"{{{', '.join(serialized_kv)}}}" return json.dumps(data) # 调用示例 my_list_of_dicts = [ {"custom_module_id": "23", "answer": "some text 2", "user_id": "111"}, {"custom_module_id": "24", "answer": "a", "user_id": "111"} ] my_query_string = serialize_graphql_input(my_list_of_dicts)
运行后输出的字符串完全符合你需要的格式,后续新增、删除字典字段都不需要修改序列化逻辑。
生产环境推荐方案:使用GraphQL专用客户端
手动拼接、序列化GraphQL query字符串很容易出现语法错误,遇到值里带特殊字符(比如双引号、换行)时还可能出现转义问题,生产环境更推荐使用专门的GraphQL Python客户端,这类工具的优势非常明显:
- 不需要手动处理任何格式转换,直接传入原生Python字典/列表作为变量即可,客户端会自动生成符合规范的请求内容
- 自带参数转义,从根源避免语法错误和注入风险
- 支持query模板缓存、语法校验、错误提示等实用功能
使用时遵循GraphQL官方推荐的「query模板+variables传参」模式即可,完全不需要手动拼值部分的字符串:
# 定义mutation模板,不需要把值硬编码在query里 mutation_query = """ mutation SubmitCustomAnswers($answerList: [CustomAnswerInput!]!) { submitCustomAnswers(answers: $answerList) { code message } } """ # 变量直接传原生Python结构,客户端自动做序列化 variables = {"answerList": my_list_of_dicts} # 发起请求 resp = client.execute(mutation_query, variables=variables)
额外提醒:不要把用户输入的内容直接拼接在query字符串里,用variables传参是GraphQL的标准最佳实践。
内容的提问来源于stack exchange,提问作者vasili111
相关产品推荐
相关产品推荐

