处理 Flask RESTful 端点查询的正确方法是什么?
What is the correct way to handle queries for a Flask RESTful endpoint?
我正在使用 Flask-RESTful 创建一个 API,并试图创建一个资源,其中 return 包含数据库中的所有项目,就像用户定义的字符串一样。
此资源的端点定义为:
api = Api(app)
api.add_resource(ItemsList, '/privateapi/item?query=<string:tag>')
而资源本身是:
class ItemsList(Resource):
def get(self, tag):
search = f"%{tag}%"
items = ItemModel.query.filter(ItemModel.item_name.like(search)).all()
return {"items": [item.json() for item in items]}
问题是,当我向端点 http://127.0.0.1:5000/privateapi/item?query=appl
发送 GET 请求时,我收到 404
响应。
当我将端点更改为 api.add_resource(ItemsList, '/privateapi/item/<string:tag>')
然后查询 API 时,我得到了所需的响应。
但是,我更愿意使用查询方法,因为我不想获取单个记录,而是想 return 一个数组。我只是觉得这样更有意义。
我可以尝试什么?
在 flask 中,查询参数不用于匹配路由(只有 URL 的路径部分是相关的)。当你写:
api.add_resource(ItemsList, '/privateapi/item?query=<string:tag>')
您创建了一条永远不会匹配的路线(好吧,不完全匹配;见下文)。
您访问 request.args
值中的查询参数,如下所示:
from flask import Flask, request
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class ItemsList(Resource):
def get(self):
query = request.args.get("query")
return f"Query expression was: {query}"
api.add_resource(ItemsList, "/privateapi/item")
if __name__ == "__main__":
app.run(debug=True)
有了上面的代码,如果我这样写:
curl http://127.0.0.1:5000/privateapi/item?query=appl
我得到的回应是:
"Query expression was: appl"
当我说“您创建了一条永远不会匹配的路线”时,这实际上是一个谎言。事实上,您已经创建了一个在 URL 路径中需要文字 ?
的路由,因此如果您要为此 URL:
发出请求
curl http://127.0.0.1:5000/privateapi/item%3Fquery=appl
它会起作用,但这不是你想要的。
我正在使用 Flask-RESTful 创建一个 API,并试图创建一个资源,其中 return 包含数据库中的所有项目,就像用户定义的字符串一样。
此资源的端点定义为:
api = Api(app)
api.add_resource(ItemsList, '/privateapi/item?query=<string:tag>')
而资源本身是:
class ItemsList(Resource):
def get(self, tag):
search = f"%{tag}%"
items = ItemModel.query.filter(ItemModel.item_name.like(search)).all()
return {"items": [item.json() for item in items]}
问题是,当我向端点 http://127.0.0.1:5000/privateapi/item?query=appl
发送 GET 请求时,我收到 404
响应。
当我将端点更改为 api.add_resource(ItemsList, '/privateapi/item/<string:tag>')
然后查询 API 时,我得到了所需的响应。
但是,我更愿意使用查询方法,因为我不想获取单个记录,而是想 return 一个数组。我只是觉得这样更有意义。
我可以尝试什么?
在 flask 中,查询参数不用于匹配路由(只有 URL 的路径部分是相关的)。当你写:
api.add_resource(ItemsList, '/privateapi/item?query=<string:tag>')
您创建了一条永远不会匹配的路线(好吧,不完全匹配;见下文)。
您访问 request.args
值中的查询参数,如下所示:
from flask import Flask, request
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class ItemsList(Resource):
def get(self):
query = request.args.get("query")
return f"Query expression was: {query}"
api.add_resource(ItemsList, "/privateapi/item")
if __name__ == "__main__":
app.run(debug=True)
有了上面的代码,如果我这样写:
curl http://127.0.0.1:5000/privateapi/item?query=appl
我得到的回应是:
"Query expression was: appl"
当我说“您创建了一条永远不会匹配的路线”时,这实际上是一个谎言。事实上,您已经创建了一个在 URL 路径中需要文字 ?
的路由,因此如果您要为此 URL:
curl http://127.0.0.1:5000/privateapi/item%3Fquery=appl
它会起作用,但这不是你想要的。