使用flask-restless时POST请求的错误

1 投票
1 回答
997 浏览
提问于 2025-04-18 10:35

我在使用flask-restless的时候,第一次通过Postman发送POST请求时遇到了一个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 个回答

2

我觉得解释这个错误的最好方法,就是告诉你我当时的想法。

在使用API的时候,你会经常遇到这种情况,所以了解如何思考这些逻辑是很重要的。

  1. 你遇到了400错误——这意味着你发送的JSON格式不符合Flask的预期。
  2. 根据你的问题,去掉“listing”字段解决了问题——这感觉我们离答案更近了。
  3. 我查看了你想要修改的模型(/api/appraisals)——就是Appraisals
  4. 你的模型是:

    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'))
    
  5. 看完这个,你可以看到Flask期待的是“listing_id”,而不是“listing”。

希望我说得清楚,如果你需要任何帮助,请告诉我。祝好运!

撰写回答