使用 flask-restless 对 POST 的错误请求与关系
Posted
技术标签:
【中文标题】使用 flask-restless 对 POST 的错误请求与关系【英文标题】:Bad request for POST with relationship using flask-restless 【发布时间】:2014-08-11 20:03:12 【问题描述】:我正在使用 flask-restless 并在我的第一个 POST(来自 Postman)时收到错误请求 (400) 错误。如果我继续提出相同的请求,它就会不断出错。但是,如果我删除 flask-restless 抱怨的字段,再次运行 POST,得到肯定的响应,重新添加相同的字段,然后再次运行,从那时起它就可以正常工作了。
网址:/api/appraisals
请求 JSON:
"suggested_price": 88,
"listing": "id": 1
错误响应:
"message": "Model does not have field 'listing'"
app.py:
from models.db import init_app
from controllers import api
app = Flask(__name__)
app.config.from_object('config')
init_app(app)
api.init_api(app)
来自models.db.py:
from flask.ext.sqlalchemy import SQLAlchemy
def init_app(app):
with app.app_context():
db.init_app(app)
db.create_all()
db = SQLAlchemy()
来自 controllers.api.py:
from flask.ext.restless import APIManager
class ResourceManager(APIManager): ...
def init_api(app):
with app.app_context():
manager = ResourceManager(app, flask_sqlalchemy_db=db)
manager.add_resource(ListingResource())
manager.add_resource(AppraisalResource())
来自models.appraisal.py:
from .db import db
from .base import BaseModel
class Appraisal(BaseModel):
__tablename__ = "appraisal"
# required fields
suggested_price = db.Column(db.Integer, nullable=False)
# optional fields
currency = db.Column(db.Unicode, default=u"USD")
# relationships
listing_id = db.Column(db.Integer, db.ForeignKey('listing.id'))
来自models.listing.py:
from sqlalchemy.schema import UniqueConstraint
from .db import db
from .base import BaseModel
class Listing(StatusfulModel, BaseModel):
__tablename__ = "listing"
# relationships
appraisals = db.relationship(
"Appraisal",
backref=db.backref("listing", uselist=False),
uselist=True)
来自 controllers.resource.appraisal.py:
class AppraisalResource(Resource):
model_class = Appraisal
base_url = "appraisals"
allowed_methods = ["POST", "GET"]
def get_fields(self):
super_fields = super(AppraisalResource, self).get_fields()
return super_fields + [
"listing",
"listing.id"
]
【问题讨论】:
两个问题: 1. 你用什么来发出POST
请求? 2.ListingResource
长什么样子?
你试过用listing_id代替listing吗?
@OrDuan listing_id 有效。这是正确的方法吗?
@EvanHammer 我发布了一个答案,因为它很想发表评论
【参考方案1】:
我认为解释如何解决此错误的最佳方式是告诉您我在考虑时的想法。
您会经常使用 API 进入这些情况,并且了解如何考虑逻辑是很重要的。
-
您收到错误 400 - 这意味着您发送了 JSON 但不是 Flask 期望的格式。
根据您的问题,删除列表字段解决了问题 - 感觉我们越来越近了。
我查看了您尝试更改的模型(
/api/appraisals
) - 评估
你的模特:
class Appraisal(BaseModel):
__tablename__ = "appraisal"
suggested_price = db.Column(db.Integer, nullable=False)
currency = db.Column(db.Unicode, default=u"USD")
listing_id = db.Column(db.Integer, db.ForeignKey('listing.id'))
查看后,您可以看到 Flask 期待“listing_id” - 而不是“listing”
我希望我很清楚,如果您需要任何帮助,请告诉我。 祝你好运!
【讨论】:
感谢您,因为这解决了问题。谢谢你!但是错误的不稳定性质是烧瓶不安定的问题。我两次发送相同的请求:一次失败,一次有效。此外,listing
是 Appraisal 对象上的关系。如果你列出它的RelationshipProperty,你可以看到它。以上是关于使用 flask-restless 对 POST 的错误请求与关系的主要内容,如果未能解决你的问题,请参考以下文章
Flask-Restless 的复杂路由(例如“忘记密码”)
使用请求时如何为 Flask-Restless 构建复杂的过滤器?