Flask-PyMongo-InsertOneResult类型的对象不可JSON序列化 [英] Flask-PyMongo - Object of type InsertOneResult is not JSON serializable

查看:339
本文介绍了Flask-PyMongo-InsertOneResult类型的对象不可JSON序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个api,我正在尝试使用Flask-Pymongo存储/发布用户对象.

i have an api and i am trying to store/post a user object using Flask-Pymongo.

但是,我收到以下错误消息

but, i get the following error

文件 /home/kay/.local/share/virtualenvs/server-iT4jZt3h/lib/python3.7/site-packages/flask/json/i│ nit .py",行jsonify
中的321行 │ 转储(数据,缩进=缩进,分隔符=分隔符)+'\ n',│文件 /home/kay/.local/share/virtualenvs/server-iT4jZt3h/lib/python3.7/site-packages/flask/json/i│ nit .py",第179行,在转储中
│ rv = _json.dumps(obj,** kwargs)│在转储文件中的文件"/usr/lib/python3.7/json/init.py",第238行,
│ ** kw).encode(obj)│文件"/usr/lib/python3.7/json/encoder.py",第201行,位于encoding
│ 块=列表(块)│文件"/usr/lib/python3.7/json/encoder.py",行438,在 _iterencode│ o = _default(o)│默认情况下,文件"/home/kay/link/server/src/run.py"第18行
│ 返回json.JSONEncoder.default(self,o)│默认情况下,文件"/usr/lib/python3.7/json/encoder.py"第179行
│ 引发TypeError(f'类型为{o. class . name }}的对象'│TypeError:InsertOneResult类型的对象不可JSON序列化

File "/home/kay/.local/share/virtualenvs/server-iT4jZt3h/lib/python3.7/site-packages/flask/json/i│ nit.py", line 321, in jsonify
│ dumps(data, indent=indent, separators=separators) + '\n', │ File "/home/kay/.local/share/virtualenvs/server-iT4jZt3h/lib/python3.7/site-packages/flask/json/i│ nit.py", line 179, in dumps
│ rv = _json.dumps(obj, **kwargs) │ File "/usr/lib/python3.7/json/init.py", line 238, in dumps
│ **kw).encode(obj) │ File "/usr/lib/python3.7/json/encoder.py", line 201, in encode
│ chunks = list(chunks) │ File "/usr/lib/python3.7/json/encoder.py", line 438, in _iterencode │ o = _default(o) │ File "/home/kay/link/server/src/run.py", line 18, in default
│ return json.JSONEncoder.default(self, o) │ File "/usr/lib/python3.7/json/encoder.py", line 179, in default
│ raise TypeError(f'Object of type {o.class.name} ' │ TypeError: Object of type InsertOneResult is not JSON serializable

app/users/resource.py

from flask_restful import Resource
from flask import jsonify, request
from .repository import UsersRepository
from db import mongo


class UsersResource(Resource):

    def __init__(self):

        self.repository = UsersRepository()

    def get(self):

        data = {"Users": "Resource"}
        res = data, 200
        return res

    def post(self):

        req = request.get_json()

        user = {
            "email": req.get("email"),
            "password": req.get("password")
        }

        result = mongo.db.users.insert_one(user)

        return jsonify(result)

run.py

from flask import Flask
from app import api_bp
from db import mongo
from bson.objectid import ObjectId
import json
import datetime
import os

class JSONEncoder(json.JSONEncoder):

    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        if isinstance(o, set):
            return list(o)
        if isinstance(o, datetime.datetime):
            return str(o)
        return json.JSONEncoder.default(self, o)



def create_app(config_filename):

    app = Flask(__name__)
    app.config.from_object(config_filename)
    app.register_blueprint(api_bp, url_prefix='/api')

    mongo.init_app(app)

    app.json_encoder = JSONEncoder

    return app


# def logger():


# def database():


if __name__ == "__main__":
    app = create_app("config")
    app.run(host='0.0.0.0', port=8080, debug=True)

推荐答案

我相信,按照之前的建议,您可以找到答案.但我想提供另一种简化它的解决方案.

I believe that following previous suggestion you can find the answers. But I would like to provide another solution that simplifies it.

该解决方案假定已安装pymongoflask软件包:

The solution assumes that pymongo and flask packages are installed:

from flask import Flask
from flask.json import JSONEncoder

from bson import json_util

from . import resources

# define a custom encoder point to the json_util provided by pymongo (or its dependency bson)
class CustomJSONEncoder(JSONEncoder):
    def default(self, obj): return json_util.default(obj)

application = Flask(__name__)
application.json_encoder = CustomJSONEncoder

if __name__ == "__main__":
    application.run()

这篇关于Flask-PyMongo-InsertOneResult类型的对象不可JSON序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆