首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >flask restful:传递参数到GET请求

flask restful:传递参数到GET请求
EN

Stack Overflow用户
提问于 2015-06-11 19:31:21
回答 3查看 97.5K关注 0票数 55

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

代码语言:javascript
复制
/bar?key1=val1&key2=val2

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

代码语言:javascript
复制
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')

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-11 19:43:36

Flask可以通过请求解析参数

代码语言:javascript
复制
from flask import request

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

代码语言:javascript
复制
args = request.args
print (args) # For debugging
no1 = args['key1']
no2 = args['key2']
return jsonify(dict(data=[no1, no2])) # or whatever is required
票数 45
EN

Stack Overflow用户

发布于 2015-06-11 19:51:17

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

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

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

它对参数执行验证,不需要jsonify

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

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

票数 51
EN

Stack Overflow用户

发布于 2016-07-20 19:50:44

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

代码语言:javascript
复制
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

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30779584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档