python-3.x - 如何在 RESTful Flask/SQLAlchemy/Marshmallow 环境中读取 GET 请求的参数
问题描述
圣诞节前我正在学习一些教程,现在我正试图从我离开的地方开始。尝试通过构建一些简单的 API 端点来自学 REST。我的困惑来自于我找不到我正在使用的教程,而且似乎有几种不同的方法可以解决这个问题。所以现在我不确定正确的方法是什么。该代码适用于返回数据库中的所有客户,现在我想根据他们的 Id 返回一个特定的客户
好的,这就是我所拥有的...
我有一个 app.py 定义这样的资源:
api.add_resource(CustomerResource, '/Customer')
我有一个models.py,它定义了这样的客户类:
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 将客户类定义为:
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 成功返回所有客户。但现在我希望能够使用 GET http://127.0.0.1:5000/api/Customer/10并返回客户 id = 10 的详细信息
我不确定是否需要定义新资源或是否可以修改现有 CustomerResource 以测试参数是否存在。
任何指导表示赞赏...
解决方案
是的,你是对的,不要使用该request.args
方法,而是创建另一个资源。记住api.add_resource
本质上只是将处理程序映射到 RESTFUL 端点。如果您在端点之间共享大量重复的业务逻辑代码,我建议您将该业务逻辑抽象为一个辅助函数并在您的资源定义中使用该辅助函数,但在这种特殊情况下,这不是必需的。我会考虑执行以下操作:
应用程序.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文件原样,我会考虑使用jsonify
烧瓶提供的方法在您的 RESTFUL 端点中返回您的数据。我已经在特定的客户端点中展示了一个例子。
希望这会有所帮助!
推荐阅读
- java - Integrate Visualvm with Eclipse (4.9) and JDK 10
- java - 如何用 Gson 替换 Guava 中的 TypeToken(特别是在使用泛型类型时)
- supervisord - 从主管运行 pipenv
- javascript - Cannot find specific paths when going from local to server
- spring-boot - 没有找到类型咨询的房地产咨询!遍历路径:Consultant.consultancy
- php - yii2覆盖用户组件给出以下错误:身份对象必须实现IdentityInterface
- uwp - 在 Window OS 中自定义共享面板
- r - R中的样本协方差矩阵
- python - 如何将python的整数列表转换为十六进制列表,得到列表错误“struct.error:所需参数不是整数”
- javascript - 在javascript中调用函数的不同方式