Kann flask doppelte Header in einer Antwort senden?

Sep 02 2020

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

3 DarkSuniuM Sep 01 2020 at 23:24

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.