将request.form.items()列表插入MongoDB时遇语法错误求助
Flask插入MongoDB时的语法错误解决
问题背景
遍历动态生成的表单,将用户自定义字段存入列表(示例输出:[('name', 'David'), ('phone', '90'), ('email', 'inf'), ('company', 'Ran'), ('Kids Names', 'Kids Names'), ('Kids Birthday', '2022-08-03'), ("Wife's Email", 'Test@test.com')]),尝试将该列表与固定字段一起插入MongoDB时触发语法错误。
原代码
@app.route("/create", methods=["POST", "GET"]) @login_required def create(): if request.method == "POST": list = [] for x in request.form.items(): if x[0] == "date": datefc = datetime.strptime(x[1], "%Y-%m-%d") elif x[0] == "frequency": frequency = x[1] elif x[0] == "submit": continue else: list.append(x) adate = datetime.today() if frequency == "Weekly": nContactTime = datefc + timedelta(days=7) elif frequency == "Monthly": nContactTime = datefc + timedelta(days=30) elif frequency == "Quarterly": nContactTime = datefc + timedelta(days=90) people.insert_one({list, "frequency": frequency, "parentrecord": current_user.user_json['_id'], "dateadded": adate.strftime("%x"),"datefc": datefc, "nextContact": nContactTime}) flash('Your record has been entered successfully.') return redirect(url_for('profile'))
报错信息
Traceback (most recent call last): File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 196, in _run_module_as_main return _run_code(code, main_globals, None, File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86, in _run_code exec(code, run_globals) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\__main__.py", line 3, in <module> main() File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\cli.py", line 986, in main cli.main() File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\cli.py", line 567, in main return super().main(*args, **kwargs) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\click\core.py", line 1055, in main rv = self.invoke(ctx) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\click\core.py", line 1657, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\click\core.py", line 1404, in invoke return ctx.invoke(self.callback, **ctx.params) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\click\core.py", line 760, in invoke return __callback(*args, **kwargs) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\click\decorators.py", line 84, in new_func return ctx.invoke(f, obj, *args, **kwargs) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\click\core.py", line 760, in invoke return __callback(*args, **kwargs) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\cli.py", line 848, in run_command app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\cli.py", line 279, in __init__ self._load_unlocked() File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\cli.py", line 313, in _load_unlocked self._app = rv = self.loader() File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\cli.py", line 373, in load_app app = locate_app(import_name, None, raise_if_not_found=False) File "C:\Users\David PC\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\cli.py", line 214, in locate_app __import__(module_name) File "C:\Users\David PC\Desktop\VS Code Python\Flask Site\app.py", line 150 people.insert_one({list, "frequency": frequency, "parentrecord": current_user.user_json['_id'], "dateadded": adate.strftime("%x"),"datefc": datefc, "nextContact": nContactTime}) ^ SyntaxError: invalid syntax Process finished with exit code 1
问题原因
insert_one要求传入字典类型参数,但代码中直接将列表list放入字典字面量的语法不合法——Python不允许在字典中同时存在集合元素和键值对。需要先将键值对列表转换为字典,再与固定字段合并。
解决方案
- 替换内置类型变量名:将
list改为custom_fields,避免覆盖Python内置的list类型。 - 列表转字典:用
dict()函数将键值对列表转换为字典。 - 合并字段字典:将自定义字段字典与固定字段字典合并后,再传入
insert_one。
修改后的代码:
@app.route("/create", methods=["POST", "GET"]) @login_required def create(): if request.method == "POST": custom_fields = [] for x in request.form.items(): if x[0] == "date": datefc = datetime.strptime(x[1], "%Y-%m-%d") elif x[0] == "frequency": frequency = x[1] elif x[0] == "submit": continue else: custom_fields.append(x) adate = datetime.today() if frequency == "Weekly": nContactTime = datefc + timedelta(days=7) elif frequency == "Monthly": nContactTime = datefc + timedelta(days=30) elif frequency == "Quarterly": nContactTime = datefc + timedelta(days=90) # 将自定义字段列表转为字典 custom_fields_dict = dict(custom_fields) # 合并所有字段 record = { **custom_fields_dict, "frequency": frequency, "parentrecord": current_user.user_json['_id'], "dateadded": adate.strftime("%x"), "datefc": datefc, "nextContact": nContactTime } people.insert_one(record) flash('Your record has been entered successfully.') return redirect(url_for('profile'))
补充说明
- 除了
**解包合并字典,也可以用custom_fields_dict.update(固定字段字典)的方式实现合并。 datefc和nContactTime是标准datetime对象,MongoDB原生支持存储该类型,无需额外转换。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

