如何解决Flask-反序列化JSON并加载到Postgres DB
我有一个带有后端Flask的前端React应用。 从React提交表单时,我想将数据发送到后端flask应用程序,然后将其添加到Postgres DB。
反应-handleSubmit
handleSubmit(event){
fetch('http://localhost:5000/results',{
method: 'POST',headers:{
'Content-Type': 'application/json'
},body: JSON.stringify(this.state)
}).then(function(response){
console.log(response)
return response.json();
});
event.preventDefault();
}
提交的表单在下面创建对象时,如何添加反序列化json数据,并在postgres中添加一行?
{
name: Bob,location: New York,NY,days: {Mon: true,Tue: false,Wed: true,Thu: false,Fri: true}
}
这是我到目前为止在python中所拥有的-我具有api_post函数,用于发布来自react的数据,然后具有sqlalchemy模式,该模式指示我希望数据在表中的外观。在这种情况下,如何集成棉花糖库或酸洗以将每个json数据另存为自己的单独列?
#api.py
from flask import Flask,redirect,url_for,request,jsonify
from flask_cors import CORS
import datetime
from flask_sqlalchemy import SQLAlchemy
from config import DATABASE_URI
app = Flask(__name__)
CORS(app)
app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
#getting the data from React
@app.route('/',methods=['POST'])
def api_post():
if request.method == 'POST':
shift = request.json
db.session.add(jsonify(shift))
db.session.commit()
#database schema
class Shifts(db.Model):
__table__ = 'shifts'
emp_id = db.Column(db.Integer,primary_key=True)
created_at = db.Column(db.DateTime,default=datetime.datetime.utcnow)
name = db.Column(db.String,nullable=False)
location = db.Column(db.String,nullable=False)
mon = db.Column(db.Boolean,nullable=False)
tue = db.Column(db.Boolean,nullable=False)
wed = db.Column(db.Boolean,nullable=False)
thu = db.Column(db.Boolean,nullable=False)
fri = db.Column(db.Boolean,nullable=False)
def __init__(self,name,location,mon,tue,wed,thu,fri):
self.name = name
self.location = location
self.mon = mon
self.tue = tue
self.wed = wed
self.thu = thu
self.fri = fri
db.create_all()
解决方法
通常,您需要先验证用户输入,然后再将其保存到数据库中,但为简单起见,我将忽略此部分。
您得到的错误是因为flask的jsonify
返回了一个响应对象,该对象的标头设置为application / json。 request.json
应该已经将您的json解析为字典(当它实际上是字典而不是json时,我们将忽略该属性称为json的事实)。
现在,我们已将用户输入作为字典,我们可以使用它来创建Shifts对象,然后将其添加到数据库中。这只是一条路线的示例,其余代码将保持不变:
@app.route('/',methods=['POST'])
def api_post():
if request.method == 'POST':
data = request.json
try:
shift = Shifts(
name=data["name"],location=data["location"],mon=data["mon"],tue=data["tue"],wed=data["wed"],thu=data["thu"],fri=data["fri"],)
except KeyError:
return "missing required value",400
db.session.add(shift)
db.session.commit()
return "",201
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。