首页 > 解决方案 > 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()

标签: pythonjsonreactjspostgresqlflask

解决方案


通常,您希望在将用户输入保存到数据库之前对其进行验证,但为了简单起见,我将忽略这部分。

您得到的错误是因为烧瓶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

推荐阅读