Flask-反序列化JSON并加载到Postgres DB



我有一个带有后端Flask的前端React应用程序。当从React提交表单时,我想将数据发送到后端flask应用程序,然后将其添加到Postgres DB。

React-handle Submit

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模式。在这种情况下,我如何集成棉花糖库或pickle,将每个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的头的Response对象。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

最新更新