Kann flask doppelte Header in einer Antwort senden?
Ich möchte, dass meine Kolben-App mehrere Header mit demselben Schlüssel und unterschiedlichen Werten wie folgt setzt:
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Ich weiß bereits, dass dies einem einzelnen Header entspricht, dessen Wert eine durch Kommas getrennte Liste ist (natürlich nur für Header, die einen Listenwert unterstützen), aber ich würde es lieber wie oben tun. Da Header jedoch in einem Diktat gespeichert sind, kann ich nicht einfach einen doppelten Schlüssel hinzufügen.
Mir ist auch diese Frage und Antwort bekannt , die besagt, dass das requestsModul nicht mehrere Header mit demselben Schlüssel senden kann. Aber diese Frage ist ungefähr requestsund hat flaskmanchmal zusätzliche Extras; Auch die Frage ist über sieben Jahre alt und es passieren Dinge.
Ist diese Antwort aktuell? Gilt das auch für Kolben?
Antworten
Header anfordern
Sie können doppelte Kopfzeilen haben, Flask wandelt sie jedoch in einen Text um, Werte werden durch Komma getrennt.
Das einfachste Beispiel wäre:
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
print(request.headers)
return "Hello"
mit folgendem curl:curl http://127.0.0.1:5000 -H 'X-HEADER: 1' -H 'X-HEADER: 2'
Flask würde drucken X-Header: 1,2für Sie X-Headerauch in Header, können Sie eine Liste von Werten erhalten können mit request.headers.getlist('X-Header'), aber es klebt noch die Werte zusammen und gibt eine Liste mit nur einem Element.['1,2']
Das request.headersist eine Instanz vonwerkzeug.datastructures.EnvironHeaders
Sicherlich können Sie es ändern, um Ihre eigene Header-Klasse zu verwenden. Sie können eine flask.RequestKlasse erben und eine eigene requestInstanz mit einer benutzerdefinierten HeadersKlasse erstellen
Hier können Sie mehr darüber lesen EnvironHeaders:https://werkzeug.palletsprojects.com/en/1.0.x/datastructures/#werkzeug.datastructures.EnvironHeaders
Antwortheader
Zu den Antwortheadern:
Alle Kolbenantworten kommen aus der flask.ResponseKlasse.
Sie können Ihre Antwort aus Ihrer Sicht wie folgt zurückgeben:
from flask import flask, Response
app = Flask(__name__)
@app.route('/')
def index():
return Response('Hello', headers={'X-Headers': [1, 2]})
Sie können dies folgendermaßen testen curl: curl http://127.0.0.1:5000 -vvvIch habe hinzugefügt -vvv, um die Ausführlichkeit zu erhöhen und Überschriften anzuzeigen
In den Antwortheadern wird Folgendes angezeigt:
< X-Headers: 1
< X-Headers: 2
Auch wenn Sie keine ResponseKlasse verwenden möchten , können Sie mehrere Werte aus einer Ansicht zurückgeben
@app.route('/')
def index():
return '<h1>Hello!</h1>', 200, {'X-Headers': [1, 2]}
Der erste Wert ist der Hauptteil Ihrer Antwort, der zweite der Statuscode und der letzte die Überschriften Ihrer Antwort.