python - Flask - 反序列化 JSON 并加载到 Postgres DB
问题描述
我有一个带有后端 Flask 的前端 React 应用程序。从 React 提交表单时,我想将数据发送到后端烧瓶应用程序,然后将其添加到 Postgres DB。
反应 - 处理提交
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()
解决方案
通常,您希望在将用户输入保存到数据库之前对其进行验证,但为了简单起见,我将忽略这部分。
您得到的错误是因为烧瓶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
推荐阅读
- android - Flutter Webview Url 管理
- android - Android10:无法使用我的应用程序中的连接 WiFi 访问互联网
- firebase - 使用 firestore Firestore 时出现以下错误:错误:FIRESTORE (8.1.2) INTERNAL ASSERTION FAILED: Unexpected state
- jquery - 为什么 jquery 的选择器没有返回 false?
- amazon-web-services - 如何为 IAM 角色策略模板使用 Cognito 自定义属性
- python - 为什么转换 ndarray->DataFrame 会改变值?
- javascript - 根据数据以角度设置:defore css属性
- unix - cronjob 将文件从一个目录复制到当前日期文件夹下的另一个目录(如果不存在)
- angular - 如何从 mat-form-field 的指令中获取 FormControlName?
- javascript - 如何在 searchconsole('v1') 中传递参数