首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从烧瓶请求中获取模型数据

从烧瓶请求中获取模型数据
EN

Stack Overflow用户
提问于 2021-07-20 14:47:10
回答 2查看 443关注 0票数 0

我正在制作我的第一个Python/Flask。我目前正在处理我的post请求,该请求应该包含如下所示的JSON对象。每个值都应该是基于用户输入的整数或null。

代码语言:javascript
复制
{
  "FIDE": {
    "standard": 1555,
    "rapid": 1500,
    "blitz": null
  },
  "USCF": {
    "regular": null,
    "quick": null,
    "blitz": null
  },
  "Chesscom": {
    "bullet": null,
    "blitz": 1556,
    "rapid": 1601,
    "daily": null,
    "puzzle": null
  },
  "LiChess": {
    "bullet": null,
    "blitz": null,
    "rapid": null,
    "classical": null,
    "correspondence": null,
    "training": null
  }
}

这个输入应该击中这个基本的烧瓶应用程序。我应该注意,我刚刚创建了模型,我不确定是否正确地处理了深度大于1的对象。

代码语言:javascript
复制
from flask import Flask , request, redirect, url_for, Response
from flask_sqlalchemy import SQLAlchemy
import json

app = Flask(__name__)

db= SQLAlchemy(app)

class Player(db.model):
    __tablename__ = 'Players'
    id = db.Column(db.Integer, primary_key=True)
    FIDE.standard(db.Integer, nullable = True)
    FIDE.rapid(db.Integer, nullable = True)
    FIDE.blitz(db.Integer, nullable = True)
    USCF.regular(db.Integer, nullable = True)
    USCF.quick(db.Integer, nullable = True)
    USCF.blitz(db.Integer, nullable = True)
    Chesscom.bullet(db.Integer, nullable = True)
    Chesscom.blitz(db.Integer, nullable = True)
    Chesscom.rapid(db.Integer, nullable = True)
    Chesscom.daily(db.Integer, nullable = True)
    Chesscom.puzzle(db.Integer, nullable = True)
    Lichess.bullet(db.Integer, nullable = True)
    Lichess.blitz(db.Integer, nullable = True)
    Lichess.rapid(db.Integer, nullable = True)
    Lichess.correspondence(db.Integer, nullable = True)
    Lichess.training(db.Integer, nullable = True)
    

@app.route('/')
def index():
    return 'Hello David'

@app.route('/add', methods = ['POST'])
def add(Player):
    request_data= Player.getjson()
    response = Response(request_data.FIDE.standard, status=200, mimetype='application/json')
    return response

当我向邮递员发送请求时,我收到一条错误消息,上面写着

TypeError:异常必须从BaseException派生

我相信,这是错误信息的相关部分,但我可能错了。我会把下面的全部错误包括进去。但是,有人知道我在app.py文件中做错了什么吗?

以下是完整的错误消息

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Users\dreke\Documents\coding\sideProject\chess-backend\venv\Lib\site-packages\flask\cli.py", line 354, in __call__
    self._flush_bg_loading_exception()
  File "C:\Users\dreke\Documents\coding\sideProject\chess-backend\venv\Lib\site-packages\flask\cli.py", line 342, in _flush_bg_loading_exception
    raise exc_info
TypeError: exceptions must derive from BaseException
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-23 17:51:41

如果要将JSON作为原始数据在正文中作为POST请求传递,那么下面的代码应该可以工作-

代码语言:javascript
复制
from flask import Flask, request, redirect, url_for, Response
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)


@app.route('/')
def index():
    return 'Hello David'

@app.route('/add', methods = ['POST'])
def add():
    request_data = request.get_json()
    # You can make any change or operation using the request_data
    return request_data

if __name__ == '__main__':
    app.run(debug=True)

如果您作为表单数据传递,那么将request_data = request.get_json()替换为request_data= request.form,它将完成这项工作。

为了使用SQLAlchemy操作,可能需要进行以下更改才能工作-

代码语言:javascript
复制
from flask import Flask, request, redirect, url_for, Response
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

### Assuming you are using MySQL DB
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'

db= SQLAlchemy(app)


class Player(db.Model):

    __tablename__ = 'Players'

    id                     = db.Column(db.Integer, primary_key=True, autoincrement=True)
    FIDE_standard          = db.Column(db.Integer, nullable = True)
    FIDE_rapid             = db.Column(db.Integer, nullable = True)
    FIDE_blitz             = db.Column(db.Integer, nullable = True)
    USCF_regular           = db.Column(db.Integer, nullable = True)
    USCF_quick             = db.Column(db.Integer, nullable = True)
    USCF_blitz             = db.Column(db.Integer, nullable = True)
    Chesscom_bullet        = db.Column(db.Integer, nullable = True)
    Chesscom_blitz         = db.Column(db.Integer, nullable = True)
    Chesscom_rapid         = db.Column(db.Integer, nullable = True)
    Chesscom_daily         = db.Column(db.Integer, nullable = True)
    Chesscom_puzzle        = db.Column(db.Integer, nullable = True)
    Lichess_bullet         = db.Column(db.Integer, nullable = True)
    Lichess_blitz          = db.Column(db.Integer, nullable = True)
    Lichess_rapid          = db.Column(db.Integer, nullable = True)
    Lichess_correspondence = db.Column(db.Integer, nullable = True)
    Lichess_training       = db.Column(db.Integer, nullable = True)


@app.route('/')
def index():
    return 'Hello David'

@app.route('/add', methods = ['POST'])
def add():

    request_data= request.get_json()
    
    new_player = Player(
        FIDE_standard          = request_data.get('FIDE').get('standard'),
        FIDE_rapid             = request_data.get('FIDE').get('rapid'),
        FIDE_blitz             = request_data.get('FIDE').get('blitz'),
        USCF_regular           = request_data.get('USCF').get('regular'),
        USCF_quick             = request_data.get('USCF').get('quick'),
        USCF_blitz             = request_data.get('USCF').get('blitz'),
        Chesscom_bullet        = request_data.get('Chesscom').get('bullet'),
        Chesscom_blitz         = request_data.get('Chesscom').get('blitz'),
        Chesscom_rapid         = request_data.get('Chesscom').get('rapid'),
        Chesscom_daily         = request_data.get('Chesscom').get('daily'),
        Chesscom_puzzle        = request_data.get('Chesscom').get('puzzle'),
        Lichess_bullet         = request_data.get('Lichess').get('bullet'),
        Lichess_blitz          = request_data.get('Lichess').get('blitz'),
        Lichess_rapid          = request_data.get('Lichess').get('rapid'),
        Lichess_correspondence = request_data.get('Lichess').get('correspondence'),
        Lichess_training       = request_data.get('Lichess').get('training'),
    )

    db.session.add(new_player)
    db.session.commit()

    return request_data

if __name__ == '__main__':
    app.run(debug=True)
票数 1
EN

Stack Overflow用户

发布于 2021-07-20 15:06:29

我相信这是一个水瓶问题,正如你可以在以下公关:https://github.com/pallets/flask/pull/4169

PR还没有合并,所以您将不得不使用https://github.com/Rohan-Salwan/flask/tree/dev或等待一个版本的瓶是发布与合并的PR。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68456922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档