You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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不允许在字典中同时存在集合元素和键值对。需要先将键值对列表转换为字典,再与固定字段合并。

解决方案

  1. 替换内置类型变量名:将list改为custom_fields,避免覆盖Python内置的list类型。
  2. 列表转字典:用dict()函数将键值对列表转换为字典。
  3. 合并字段字典:将自定义字段字典与固定字段字典合并后,再传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:54:28