使用Flask-RESTful获取查询参数

7

我有一个由flask-RESTful定义的端点:

class SearchEvents(Resource):
    def get(self, name, start_date, end_date):
         #do stuff

api.add_resource(endpoints.SearchEvents, '/events/<string:name>/<string:start_date>/<string:end_date>')

我正在使用Postman手动测试。我想传入起始日期和结束日期的空值。然而:

postman界面截图 我尝试修改url为:

http://127.0.0.1:5000/events/test/ /  #<--Spaces

并且

http://127.0.0.1:5000/events/test/""/""

徒劳无功。
2个回答

16

最终通过使用flask-restful request 对象解决了这个问题,它具有一个 args 属性,可以从请求URL中检索查询参数:

from flask_restful import request #import request from flask restful

class SearchEvents(Resource):
    def get(self):
        args = request.args #retrieve args from query string

api.add_resource(endpoints.SearchEvents, '/events')

然后以如下方式发起请求:http://127.0.0.1:5000/events?param1=value1&param2=value2 或者传递空值:http://127.0.0.1:5000/events?param=&param2=value1


我注意到现在的get函数只传递了self属性,为什么你要删除所有的查询参数(namestart_dateend_date)? - guy
2
这个最佳答案存在缺陷。我希望知道变量args的类型,比如 args = request.args。它该怎么使用?它是一个字典还是一个类,每个参数都有属性等等。读者需要在调试中尝试或查找文档,然后通过反复试错来确定类型,而不是已经了解它。 - Guillaume Chevalier

2
你传递的值不在查询字符串中。你正在使用路由部分作为参数,因此除非提供类似于/events/some_name/2019-86-98/2100-9885-24515的东西,否则路由无法匹配。你试图做的尝试被 Flask 捕获为不匹配的路由,并且你得到 404 找不到页面。
要将这些参数作为查询字符串发送,可以使用像 /events?name=some_name&start_date=2019-86-98&end_date=2100-9885-24515这样的形式,为了在路由处理程序中获取这些值,你应该使用 name = request.args.get('name')等方法。如果传递空值,则意味着命中相同的 URL,但没有查询参数。

我已经意识到这一点,但是无法找到在Flask-RESTful中实现的方法:当我将查询字符串放入端点URL中时,即使我提供值或不提供值,Postman请求都会得到404错误。不确定您是否熟悉flask-RESTful,但我希望能够得到一些指导。 - Toby Weed
我非常熟悉flask-restplus,但是询问指针不会得到答案。提出具体问题或在说某些东西不起作用时发布一段代码,否则无法帮助您。 首先,您应该更改注册资源的方式为api.add_resource(endpoints.SearchEvents, '/events'),否则当您使用postman向127.0.0.1:5000/events发出请求时,它将不会被命中。从基础开始,通过删除所有参数并从那里构建。 - Gastón Avila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接