RESTful Flask/SQLAlchemy/Marshmallow环境下如何读取GET请求的参数
How do I read the parameter of the GET request in a RESTful Flask/SQLAlchemy/Marshmallow environment
我在圣诞节前完成了几个教程,现在我正试图从我离开的地方开始。
尝试通过构建一些简单的 API 端点来自学 REST。我的困惑来自于我找不到我正在使用的教程,而且似乎有几种不同的方法可以解决这个问题。所以现在我不确定什么是正确的方法。
该代码适用于 return 数据库中的所有客户,现在我想 return 基于他们的 Id
的特定客户
好的,这就是我的...
我有一个 app.py 定义这样的资源:
api.add_resource(CustomerResource, '/Customer')
我有一个 models.py 定义客户 class 是这样的:
ma = Marshmallow()
db = SQLAlchemy()
class Customer(db.Model):
__tablename__ = 'customers'
__table_args__ = {"schema":"business"}
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text, nullable=False)
status = db.Column(db.Integer, nullable=False)
class CustomerSchema(ma.Schema):
id = fields.Integer()
name = fields.String(required=True)
status = fields.Integer(required=True)
我有 customer.py 将客户 class 定义为:
customers_schema = CustomerSchema(many=True)
customer_schema = CustomerSchema()
class CustomerResource(Resource):
def get(self):
customers = Customer.query.all()
customers = customers_schema.dump(customers)
return {'status': 'success', 'data': customers}, 200
我尝试过使用 request.args,但我认为这不是正确的方法,因为它会变得不受支持。
所以以上所有都成功地与 GET returning 所有客户一起工作。但现在我希望能够使用 GET http://127.0.0.1:5000/api/Customer/10 并仅 return 客户 id = 10
的详细信息
我不确定是否需要定义新资源或是否可以修改现有的 CustomerResource 以测试是否存在参数。
感谢任何指导...
是的,你是对的,不要使用 request.args
方法,而是 创建另一个资源 。请记住 api.add_resource
本质上只是 将处理程序映射到 RESTFUL 端点 。如果您有很多 端点之间共享的重复业务逻辑代码 我建议您 将业务逻辑抽象到辅助函数中 和 在您的资源定义中使用此辅助函数, 但在这种特殊情况下,这不是必需的。我会考虑执行以下操作:
app.py:
api.add_resource(CustomerList, '/Customer')
api.add_resource(Customer, '/Customer/<int:id>')
我会将 customer.py 重命名为 routes.py 之类的名称,它将包含以下内容:
class CustomerList(Resource):
def get(self):
customers = Customer.query.all()
customers = customers_schema.dump(customers)
return {'status': 'success', 'data': customers}, 200
class Customer(Resource):
def get(self, id):
customer = Customer.query.filter_by(id=id).first()
customer, errors = customers_schema.dump(customer)
if errors:
return jsonify(errors), 422
return customer, 200
保持你的 models.py 文件不变,我会考虑使用 flask 提供的 jsonify
方法在你的 RESTFUL 端点。我已经在特定的客户端点中展示了这方面的示例。
希望对您有所帮助!
我在圣诞节前完成了几个教程,现在我正试图从我离开的地方开始。 尝试通过构建一些简单的 API 端点来自学 REST。我的困惑来自于我找不到我正在使用的教程,而且似乎有几种不同的方法可以解决这个问题。所以现在我不确定什么是正确的方法。 该代码适用于 return 数据库中的所有客户,现在我想 return 基于他们的 Id
的特定客户好的,这就是我的...
我有一个 app.py 定义这样的资源:
api.add_resource(CustomerResource, '/Customer')
我有一个 models.py 定义客户 class 是这样的:
ma = Marshmallow()
db = SQLAlchemy()
class Customer(db.Model):
__tablename__ = 'customers'
__table_args__ = {"schema":"business"}
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text, nullable=False)
status = db.Column(db.Integer, nullable=False)
class CustomerSchema(ma.Schema):
id = fields.Integer()
name = fields.String(required=True)
status = fields.Integer(required=True)
我有 customer.py 将客户 class 定义为:
customers_schema = CustomerSchema(many=True)
customer_schema = CustomerSchema()
class CustomerResource(Resource):
def get(self):
customers = Customer.query.all()
customers = customers_schema.dump(customers)
return {'status': 'success', 'data': customers}, 200
我尝试过使用 request.args,但我认为这不是正确的方法,因为它会变得不受支持。
所以以上所有都成功地与 GET returning 所有客户一起工作。但现在我希望能够使用 GET http://127.0.0.1:5000/api/Customer/10 并仅 return 客户 id = 10
的详细信息我不确定是否需要定义新资源或是否可以修改现有的 CustomerResource 以测试是否存在参数。
感谢任何指导...
是的,你是对的,不要使用 request.args
方法,而是 创建另一个资源 。请记住 api.add_resource
本质上只是 将处理程序映射到 RESTFUL 端点 。如果您有很多 端点之间共享的重复业务逻辑代码 我建议您 将业务逻辑抽象到辅助函数中 和 在您的资源定义中使用此辅助函数, 但在这种特殊情况下,这不是必需的。我会考虑执行以下操作:
app.py:
api.add_resource(CustomerList, '/Customer')
api.add_resource(Customer, '/Customer/<int:id>')
我会将 customer.py 重命名为 routes.py 之类的名称,它将包含以下内容:
class CustomerList(Resource):
def get(self):
customers = Customer.query.all()
customers = customers_schema.dump(customers)
return {'status': 'success', 'data': customers}, 200
class Customer(Resource):
def get(self, id):
customer = Customer.query.filter_by(id=id).first()
customer, errors = customers_schema.dump(customer)
if errors:
return jsonify(errors), 422
return customer, 200
保持你的 models.py 文件不变,我会考虑使用 flask 提供的 jsonify
方法在你的 RESTFUL 端点。我已经在特定的客户端点中展示了这方面的示例。
希望对您有所帮助!