webentwicklung-frage-antwort-db.com.de

Akzeptieren mehrerer Parameter in flaschenrestful add_resource ()

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:

  1. eine boolesche Variable namens "analysis"
  2. eine Liste mit dem Namen "Klasse"

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!

6
Omkar Neogi

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 !

7
JahMyst

Die Abfragezeichenfolge kann nicht auf diese Weise verwendet werden.

Es wird überschrieben, verwenden Sie einfach eine Zeichenfolge wie:

class=A,B
0
CheStar