Flask api 具有多个查询参数的端点

Flask api endpoint with multiple query parameters

我确定这个问题可能在某处重复,但我不知道我的问题的正确措辞是什么。

我有我想要到达的端点,我在它们上面 运行 curl 命令:

curl http://0.0.0.0:5001/job/task/?job_type=medicine&task_type=research
curl http://0.0.0.0:5001/job/task/?job_type=medicine&task_type=research&job_id=123

我得到的错误是:

<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>

我的部分代码如下所示,我感觉这与我使用的方式有关 api.add_resource:

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class Test(Resource):

    def get(self,job_type,task_type,task_id = None):
        if not task_id:
            return {"job_type":job_type,"task_type":task_type}
        return {"job_type":job_type,"task_type":task_type,"job_id":job_id}

api.add_resource(Test, '/job/task/?<string:job_type>&<string:task_type>', '/job/task/?<string:job_type>&<string:task_type>&<int:job_id>')

如何修复错误?

你的烧瓶路线

api.add_resource(Test, '/job/task/?<string:job_type>&<string:task_type>', '/job/task/?<string:job_type>&<string:task_type>&<int:job_id>')

将由 flask 翻译成

/job/task/?job_type&task_type

没有

/job/task/?job_type=xxx&task_type=yyy

这会导致端点未找到错误。

解决方案

您可以使用 request.args (https://flask.palletsprojects.com/en/1.1.x/api/#flask.Request.args)

访问查询字符串

因此,您的 url 定义应该类似于

api.add_resource(Test, '/job/task/')

在你看来

from flask import request
.....

    def get(self):
        job_type = request.args.get("job_type")
        task_type = request.args.get("task_type")
        task_id = request.args.get("task_id")

        if not task_id:
            return {"job_type":job_type,"task_type":task_type}
        return {"job_type":job_type,"task_type":task_type,"job_id":job_id}

另一种解决方案:

  1. 使用元帅https://flask-restful.readthedocs.io/en/latest/api.html#flask_restful.marshal
  2. 使用 reqparse https://flask-restful.readthedocs.io/en/latest/api.html#reqparse.RequestParser.parse_args