在Flask中处理REST API的查询字符串参数 - The Teclado博客
查询字符串参数是REST API中常见的功能,它们通常用于在URL中传递额外的信息。其格式为“name1=value1&name2=value2”,多个值之间使用与号(&)分隔,查询字符串参数与URL的主要部分通过问号(?)隔开。
如何在Flask端点中访问查询字符串值
在Flask中访问查询字符串参数非常简单。Flask 提供了一个名为 request 的代理对象,查询字符串参数存储在 request.args 中,这是一个类似字典的对象。
以下是一个示例端点,它返回数据库中的所有存储信息:
@app.route("/store")
def get_stores():
return [{"name": store.name, "id": store.id} for store in StoreModel.query.all()]
假如我们希望通过查询字符串参数按名称过滤存储信息,例如用户发送 name=Tec,API 应返回名称以 "Tec" 开头的商店。我们可以通过以下方式获取查询字符串参数值:
from flask import request
@app.route("/store")
def get_stores():
name = request.args.get("name")
return [{"name": store.name, "id": store.id} for store in StoreModel.query.filter(StoreModel.name.startswith(name)).all()]
如果需要在商店名称的任何位置搜索指定的值,而不仅仅是以某个值开头,可以使用以下代码:
StoreModel.query.filter(StoreModel.name.like(f"%{name}%")).all()
如何访问查询字符串参数中的值列表
有时,我们需要处理查询字符串中包含多个相同参数名的情况。例如,用户发送以下查询字符串:
?tags=家具&tags=办公室
在Flask中,可以通过 request.args.getlist("tags") 获取所有值:
tags = request.args.getlist("tags")
# 返回 ["家具", "办公室"]
需要注意的是,如果使用 request.args.get("tags"),则只会返回第一个值。
虽然可以通过逗号分隔的方式手动处理多个值,例如:
tags = request.args.get("tags").split(",")
但是这种方法存在潜在问题,例如某些值可能本身包含逗号。因此,推荐使用 .getlist() 方法来处理多个查询字符串参数。
如何在Flask-Smorest资源中访问查询字符串参数
Flask-Smorest 是一个用于构建 REST API 的强大工具,它支持自动生成文档和参数验证。以下是一个示例资源类,它返回数据库中的所有存储信息:
@blp.route("/store")
class StoreList(MethodView):
@blp.response(200, StoreSchema(many=True))
def get(self):
return StoreModel.query.all()
如果需要添加查询字符串参数以按名称筛选存储信息,可以像在普通 Flask 中一样使用 request.args.get()。但 Flask-Smorest 提供了更优雅的方式,通过定义参数模式并使用装饰器进行验证和文档生成。
首先,定义查询字符串参数的模式:
class StoreSearchQueryArgs(BaseSchema):
name: str | None
然后在资源类中使用 @blp.arguments() 装饰器:
@blp.route("/store")
class StoreList(MethodView):
@blp.arguments(StoreSearchQueryArgs, location="query")
@blp.response(200, StoreSchema(many=True))
def get(self, search_values):
return StoreModel.query.filter(StoreModel.name.startswith(search_values.get("name", ""))).all()
通过这种方式,Flask-Smorest 不仅能够处理查询字符串参数,还能自动生成 API 文档并进行参数验证。
总结
本文介绍了如何在 Flask 和 Flask-Smorest 中处理查询字符串参数,包括基本的参数获取方法、多值参数的处理方式,以及如何在 Flask-Smorest 中实现参数验证和文档生成。通过这些方法,开发者可以更高效地构建功能强大的 REST API。
如果您对使用 Flask 开发 REST API 感兴趣,可以进一步学习相关课程,深入了解从基础知识到数据库操作、部署和后台任务等内容。
原文链接: https://blog.teclado.com/query-string-arguments-in-flask-rest-apis/