flask restful:将参数传递给 GET 请求

Posted

技术标签:

【中文标题】flask restful:将参数传递给 GET 请求【英文标题】:flask restful: passing parameters to GET request 【发布时间】:2015-08-27 01:51:26 【问题描述】:

我想通过以下方式创建一个支持 GET 请求的资源:

/bar?key1=val1&key2=val2

我试过这段代码,但它不工作

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

class BarAPI(Resource):
    def get(key1, key2):
        return jsonify(dict(data=[key1, key2]))

api.add_resource(BarAPI, '/bar', endpoint='bar')

谢谢!

【问题讨论】:

自您提出问题以来已经过了一段时间,您选择的答案使用了已弃用的 API。你能更新接受的答案吗? 确实,有一个更好的库叫做 flask_restful,您可以在其中定义资源(定义 CRUD 操作的数据库的“钩子”),将它们添加到 API,并使用蓝图将该 API 绑定到 Flask .在其中,您将找到 RequestParser 类,用于解析作为文档正文传递的参数。 【参考方案1】:

Flask 可以通过请求解析参数

from flask import request

您可以在需要 GET 参数的块中使用以下行。 GET 在@app.route() 声明中声明。

args = request.args
print (args) # For debugging
no1 = args['key1']
no2 = args['key2']
return jsonify(dict(data=[no1, no2])) # or whatever is required

【讨论】:

虽然 Flask 请求对象可以轻松检索 GET 参数,但它不进行任何数据验证。更好的方法是使用 marshmallowwebargs(由 marshmallow 的同一作者创建)之类的 Object Data Mapper 进行数据验证和过滤以确保 AppSec request.args.get('key1', DEFAULT_COUNT, type=int) 在查询不通过时更好的处理方式。【参考方案2】:

编辑:reqparse 不再是使用 flask-restful 执行此操作的推荐方式!,但下面还有另一个使用棉花糖的示例。

reqparse 对象已弃用。请参阅docs 或本文中的第二个示例以了解替代方案。


使用reqparse。您可以在 flask-restful docs 中看到另一个示例。

对参数进行验证,不需要jsonify

from flask import Flask
from flask_restful import Resource, Api, reqparse

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

class BarAPI(Resource):
    def get(self):

        parser = reqparse.RequestParser()
        parser.add_argument('key1', type=str)
        parser.add_argument('key2', type=str)

        return parser.parse_args()

api.add_resource(BarAPI, '/bar', endpoint='bar')

if __name__ == '__main__':
    app.run(debug=True)

另一种方法是使用marshmallow。

您可以使用Schema 类来验证request.args(对于PUT/POST 请求,您可以验证request.form

from flask import Flask, request, abort
from flask_restful import Resource, Api
from marshmallow import Schema, fields


class BarQuerySchema(Schema):
    key1 = fields.Str(required=True)
    key2 = fields.Str(required=True)

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


class BarAPI(Resource):
    def get(self):
        errors = schema.validate(request.args)
        if errors:
            abort(400, str(errors))

        return 'ok'

api.add_resource(BarAPI, '/bar', endpoint='bar')

# omit of you intend to use `flask run` command
if __name__ == '__main__':
    app.run(debug=True)

此示例要求两个参数都存在。

【讨论】:

【参考方案3】:

由于reqparse 已被弃用,这里有一个使用WebArgs 库的解决方案:

from flask import Flask
from flask_restful import Api, Resource, abort
from webargs import fields, validate
from webargs.flaskparser import use_kwargs, parser

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

class Foo(Resource):
    args = 
        'bar': fields.Str(
            required=True,
            validate=validate.OneOf(['baz', 'qux']),
        ),
    

    @use_kwargs(args)
    def get(self, bar):
        return 'bar': bar

api.add_resource(Foo, '/foo', endpoint='foo')

# This error handler is necessary for usage with Flask-RESTful.
@parser.error_handler
def handle_request_parsing_error(err, req, schema, *, error_status_code, error_headers):
    abort(error_status_code, errors=err.messages)

if __name__ == '__main__':
    app.run(debug=True)

有关更多示例,请参阅 WebArgs 存储库中的 Flask-RESTful example。

【讨论】:

以上是关于flask restful:将参数传递给 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将参数传递给 Flask-Restless GET_SINGLE 预处理器?

如何将参数传递给任务队列?

Android - 将参数传递给 Android 应用程序中的 RESTful URL

Flask - 将参数传递给 URL - 405 错误

将状态作为参数传递给环处理程序?

将多个参数传递给rest API - Spring