Ich möchte eine GET-Anforderung in meiner Flask REST-API verarbeiten. Die Anforderung enthält mehrere Parameter, und Sie können davon ausgehen, dass es sich um eine typische GET-Anforderung handelt: https: // localhost: 5000/item/analysis = true & class = A & class = B
Eine GET-Anfrage besteht also aus:
Ich möchte dies in einer add_resource () wie folgt akzeptieren:
add_resource(Item, '/item/<whatever-comes-here>')
Ich habe keine Ahnung, wie ich mehrere Parameter (von denen einer eine Liste ist) innerhalb von add_resource () akzeptieren würde. Wie akzeptiere ich sie in der Funktion add_resource () und wie entpacke ich sie in der Funktion get ()?
Ich habe Zeit mit Reverse Engineering verbracht, war aber noch nicht erfolgreich. Mache ich etwas falsch?
(Ich verstehe, dass es eine bessere Möglichkeit gibt, Listen mit einer REST API GET-Anfrage zu senden. Ich würde mich über jeden Hinweis dazu freuen!) Vielen Dank im Voraus!
URL-Parameter werden nach ?
definiert, sodass Ihre URL stattdessen lautet:
https: // localhost: 5000/item? analysis = true & class = A & class = B
Für diese URL-Parameter müssen Sie in add_resource
nichts angeben.
Sie können die Parameter einfach über das Flask
-Proxyobjekt von request
in Ihrer API-GET-Methode abrufen:
from flask import Flask, request
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
# Flask mishandles boolean as string
TRUTHY = ['true', 'True', 'yes']
class Item(Resource):
def get():
# Get `class` list from request args
classes = request.args.getlist('class')
# Get `analysis` boolean from request args
analysis = True if request.args.get('analysis') in TRUTHY else False
api.add_resource(Item, '/item')
Um die Parameter, die Sie erhalten können, flexibler zu gestalten, können Sie den eigenen Anforderungsparser von Flask Restful wie in here beschrieben verwenden, um die Anforderung zu parsen.
Der Code wird:
from flask import Flask
from flask_restful import Api, Resource, reqparse
app = Flask(__name__)
api = Api(app)
# Define parser and request args
parser = reqparse.RequestParser()
parser.add_argument('class', type=list)
parser.add_argument('analysis', type=bool, default=False, required=False, help='Enable analysis')
class Item(Resource):
def get():
args = parser.parse_args()
classes = args['class'] # List ['A', 'B']
analysis = args['analysis'] # Boolean True
api.add_resource(Item, '/item')
Schließlich ist manchmal ein kompakteres Format für eine Liste erwünscht (z. B. Beschränkung der URL-Größe). In diesem Fall verwende ich häufig eine durch Kommas getrennte Liste: https: // localhost: 5000/item? true & class = A, B
und im Anforderungsparser akzeptieren Sie ihn einfach wie eine Zeichenfolge und teilen Sie ihn in ',' auf:
parser.add_argument('class', type=str)
...
classes = args['class'].split(',')
Prost !
Die Abfragezeichenfolge kann nicht auf diese Weise verwendet werden.
Es wird überschrieben, verwenden Sie einfach eine Zeichenfolge wie:
class=A,B