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

问题描述 投票:0回答:1

我确定某个地方可能存在此问题的重复,但我不知道我所提出的问题的正确措词是什么。

我有要到达的端点,并且在它们上运行了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>')

如何解决该错误?

python flask flask-restful
1个回答
0
投票

您的烧瓶路线

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

将被烧瓶翻译成

/job/task/?job_type&task_type

不是

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

导致未找到端点的错误。

解决方案>>

您可以使用request.argshttps://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
© www.soinside.com 2019 - 2024. All rights reserved.