Django上传数据提示超出DATA_UPLOAD_MAX_NUMBER_FIELDS限制如何解决?
报错含义
The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.是Django内置的安全限制触发提示:为了防范恶意构造的大量字段请求攻击服务器,Django默认限制单次请求最多可接收1000个表单字段(不同版本默认值可能存在差异)。当前你提交的单个商品仅独立图片字段就有9个,叠加其他普通字段,后续如果商品字段增加、或者进行批量上传操作就很容易超出该上限。
解决方案
方案1:调整Django配置(快速临时解决)
在Django项目的settings.py文件中添加或修改对应配置项,调高最大字段上限,示例:
DATA_UPLOAD_MAX_NUMBER_FIELDS = 2000
注意:该方案仅放宽了限制阈值,未从根源优化请求结构,生产环境不建议将值设置过高,避免恶意攻击风险。
方案2:优化请求传输结构(生产环境推荐)
当前你将每个图片作为独立表单字段提交,字段数量会随图片数量线性增长,可拆分普通字段与文件字段传输,在不调高上限的前提下解决问题:
requests的post方法支持单独传入data参数存普通表单字段、files参数存文件类字段,两者会自动合并为form-data格式请求,调整后的脚本参考:
import json import requests if __name__ == '__main__': # 优化json读取逻辑,自动关闭文件句柄 with open('data/data.json', 'r', encoding='utf-8') as json_file: products = json.load(json_file).get("products") for index, product in enumerate(products): print(f"Creating {index + 1}/{len(products)} - {product.get('name')}") data = {} files = {} for key, value in product.items(): if key.startswith("image"): files[key] = open(value, 'rb') else: if key == 'variants': data[key] = json.dumps(value) else: data[key] = value res = requests.post( 'http://localhost:8000/api/v1/product/create', data=data, files=files, cookies={ "access_token": "", "csrftoken": "" }) # 主动关闭打开的图片文件句柄,避免资源泄漏 for f in files.values(): f.close() if res.status_code < 400: print(f"{product['name']} created successfully") else: print(f"{product['name']} failed to create") # 调试阶段可打开下方注释查看详细报错信息 # print(res.text)
内容的提问来源于stack exchange,提问作者Damiisdandy
相关产品推荐
相关产品推荐

