我有一个api,我正在尝试使用Flask-Pymongo存储/发布用户对象。
但是,出现以下错误
文件 “/home/kay/.local/share/virtualenvs/server-iT4jZt3h/lib/python3.7/site-packages/flask/json/i│ nit .py”,第321行,位于jsonify
│ 转储(数据,缩进=缩进,分隔符=分隔符)+'\ 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序列化
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)
答案 0 :(得分:0)
从bson导入json_util
在获取json输入时使用force = true:
您可以在插入mongo之前检查字段是否为空。
答案 1 :(得分:0)
我从这里找到的简单解决方案是
TypeError: ObjectId('') is not JSON serializable
响应-> bson转储(序列化)-> json加载(反序列化)
代码如下:
from bson.json_util import dumps,RELAXED_JSON_OPTIONS
import json
def post(self,name):
dream = {'name':name , 'price' : 12.00 }
dreams.append(dream)
dreamDao.addDream(dream) #MongoDB Call to Insert Data
bs = dumps(dream,json_options=RELAXED_JSON_OPTIONS) #Now dream has Response Which will have ObjectId
return json.loads(bs) , 201
答案 2 :(得分:0)
第TypeError: Object of type InsertOneResult is not JSON serializable
行描述了该问题。 insert_one()
返回一个InsertOneResult
object,其中包含插入的ID(如@styvane的注释所建议)以及一个标志,该标志指示数据库是否确认了写入。其他操作具有类似的结果对象,并且它们都不是JSON可序列化的。
未来版本的Flask-PyMongo可能会添加帮助程序来支持此操作,您可以按照https://github.com/dcrosta/flask-pymongo/issues/62添加想法和建议。
答案 3 :(得分:0)
from flask_pymongo import Pymongo
import json
import pandas as pd
user = pd.DataFrame(user)
mongo.db.users.insert_one({'email':json.loads(user[0].to_json(orient='index')),
'password':json.loads(user[1].to_json(orient='index'))})
如果您的对象已经是json,这将引发错误。如果不是,则会将它们转换为json并一次性加载。
答案 4 :(得分:0)
我相信,按照先前的建议,您可以找到答案。但我想提供另一种简化它的解决方案。
该解决方案假定已安装pymongo
和flask
软件包:
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()
答案 5 :(得分:-1)
似乎您发布到服务器的不是有效的json对象。所以你应该调试一下。
class UsersResource(Resource):
def post(self):
# debug
print("request.args is {}".format(request.args))
print("request.form is {}".format(request.form))
print("request.data is {}".format(request.data))
req = request.get_json()
user = {
"email": req.get("email"),
"password": req.get("password")
}
result = mongo.db.users.insert_one(user)
return jsonify(result)