【问题标题】:TypeError: Object of type 'ObjectId' is not JSON serializable using Flask and MongoDBTypeError:“ObjectId”类型的对象不能使用 Flask 和 MongoDB 进行 JSON 序列化
【发布时间】:2020-12-28 00:49:19
【问题描述】:

我希望将字典插入 mongo db 并返回。

我发现了几个与此错误有关的问题,但都与 READING 查询有关。由于我只是插入并且不需要解析任何输出,因此我根本不理解这种行为。

行为的主要区别在于注释/注释这一行:

db_s41.links.insert_one(new_link_doc)

注释掉行后,对象的返回就可以正常工作了。显然文档没有插入。

行没有被注释掉,返回不起作用,错误被抛出,但仍然是文档被正确插入到数据库中。

我正在使用以下代码:

from flask import Flask, redirect, url_for, request, render_template
from pymongo import MongoClient
import os

app = Flask(__name__)

client = MongoClient(
    os.environ['DOCKER_FLASK_MONGODB_DB_1_PORT_27017_TCP_ADDR'],
    27017
)

# Set db object
db_s41 = client.s41

@app.route('/new_link2')
def generate_link(berater="muster_berater", kunde='muster_kunde'):
   
    new_link_doc = {
        'link': 'test',
        'required_documents': [],
        'date_link_generated': 'test',
        'timestamp_link_generated': 'test',
        'berater_link_generated': 'test'
    }

    # insert into database 's41', collection 'links'
    db_s41.links.insert_one(new_link_doc)

    return new_link_doc

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
 

我正在使用以下版本:

Docker 版本 20.10.1,构建 831ebea 蒙戈 4.4.2 蟒蛇 3.6.6 点击 7.1.2
烧瓶 1.1.2
它的危险 1.1.0
Jinja2 2.11.2 MarkupSafe 1.1.1
点 10.0.1 pymongo 3.11.2 安装工具 39.2.0 Werkzeug 1.0.1
车轮 0.31.1

我真的很感激任何想法。

【问题讨论】:

    标签: python python-3.x mongodb flask


    【解决方案1】:

    将文档插入 MongoDB 时,如果您未指定 _id 字段,pymongo 驱动程序将在插入数据库之前将 _id 类型为 ObjectId 的字段添加到文档中。

    https://pymongo.readthedocs.io/en/stable/faq.html#writes-and-ids

    Flask 然后尝试对它不知道怎么做的字段进行 JSON 序列化;因此错误。

    一个简单的解决方法是在返回之前只对pop_id 进行修复;例如

    # insert into database 's41', collection 'links'
    db_s41.links.insert_one(new_link_doc)
    new_link_doc.pop('_id')
    
    return new_link_doc
    

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 2019-07-12
      • 2021-11-07
      • 1970-01-01
      • 2018-01-18
      • 2017-11-09
      • 2019-10-27
      • 2021-03-11
      • 1970-01-01
      相关资源
      最近更新 更多