web-dev-qa-db-fra.com

flask reposant: passage de paramètres à une requête GET

Je souhaite créer une ressource prenant en charge la requête GET de la manière suivante:

/bar?key1=val1&key2=val2

J'ai essayé ce code, mais ça ne marche pas

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')

Merci!

33
Rugnar

Le flacon peut analyser les arguments via une requête

from flask import request

Vous pouvez utiliser les lignes suivantes du bloc nécessitant des paramètres GET. GET est déclaré dans la déclaration @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
22
Aditya

Edit: Ce n'est plus la méthode recommandée pour ce faire avec flask-reposful! L'objet reqparse est obsolète, voir docs pour l'alternative recommandée.


Utilisez reqparse. Vous pouvez voir un autre exemple dans flask-reposful docs .

Il effectue la validation sur les paramètres et ne nécessite pas 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)
33
Paul Rooney

Puisque reqparse est obsolète, voici une solution utilisant la bibliothèque 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):
    abort(422, errors=err.messages)

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

Pour plus d'exemples, voir le exemple Flask-RESTful dans le référentiel WebArgs.

27
severen