web-dev-qa-db-de.com

Wie setze ich Antwort-Header in Flask?

Das ist mein Code:

@app.route('/hello', methods=["POST"])
def hello():
    resp = make_response()
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

Wenn ich jedoch eine Anfrage vom Browser an meinen Server stelle, erhalte ich folgende Fehlermeldung:

XMLHttpRequest cannot load http://localhost:5000/hello. 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

Ich habe auch diesen Ansatz ausprobiert und die Antwort-Header "nach" der Anfrage gesetzt:

@app.after_request
def add_header(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    return response

Kein Würfel. Ich bekomme den gleichen Fehler. Gibt es eine Möglichkeit, nur die Antwortheader in der Routenfunktion zu setzen? So etwas wäre ideal:

@app.route('/hello', methods=["POST"])
    def hello(response): # is this a thing??
        response.headers['Access-Control-Allow-Origin'] = '*'
        return response

aber ich kann sowieso nicht finden, dies zu tun. Bitte helfen Sie.

EDIT

wenn ich die URL mit einer POST Anfrage wie folgt einrolle:

curl -iX POST http://localhost:5000/hello

Ich bekomme diese Antwort:

HTTP/1.0 500 INTERNAL SERVER ERROR
Content-Type: text/html
Content-Length: 291
Server: Werkzeug/0.9.6 Python/2.7.6
Date: Tue, 16 Sep 2014 03:58:42 GMT

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request.  Either the server is overloaded or there is an error in the application.</p>

Irgendwelche Ideen?

78
dopatraman

Das geht ganz einfach:

@app.route("/")
def home():
    resp = flask.Response("Foo bar baz")
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

Schauen Sie sich flask.Response und flask.make_response () an

Aber irgendetwas sagt mir, dass du ein anderes Problem hast, weil das after_request hätte auch richtig damit umgehen sollen.

[~ # ~] edit [~ # ~]
Ich habe gerade bemerkt, dass Sie bereits make_response das ist eine der Möglichkeiten, es zu tun. Wie ich bereits sagte, after_request hätte auch funktionieren sollen. Versuchen Sie, den Endpunkt per Wellung zu erreichen, und sehen Sie, wie die Überschriften lauten:

curl -i http://127.0.0.1:5000/your/endpoint

Das solltest du sehen

> curl -i 'http://127.0.0.1:5000/'
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 11
Access-Control-Allow-Origin: *
Server: Werkzeug/0.8.3 Python/2.7.5
Date: Tue, 16 Sep 2014 03:47:13 GMT

Beachten Sie den Header Access-Control-Allow-Origin.

EDIT 2
Wie ich vermutet habe, bekommen Sie eine 500, so dass Sie den Header nicht so setzen, wie Sie es gedacht haben. Versuchen Sie, app.debug = True, bevor Sie die App starten, und versuchen Sie es erneut. Sie sollten eine Ausgabe erhalten, die die Ursache des Problems aufzeigt.

Beispielsweise:

@app.route("/")
def home():
    resp = flask.Response("Foo bar baz")
    user.weapon = boomerang
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

Gibt eine schön formatierte HTML-Fehlerseite aus, mit dieser am unteren Rand (hilfreich für den Curl-Befehl)

Traceback (most recent call last):
...
  File "/private/tmp/min.py", line 8, in home
    user.weapon = boomerang
NameError: global name 'boomerang' is not defined
74
sberry

Verwenden make_response von Flask sowas wie

@app.route("/")
def home():
    resp = make_response("hello") #here you could use make_response(render_template(...)) too
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

Von Flasche docs ,

flask.make_response (* args)

Manchmal ist es notwendig, zusätzliche Header in einer Ansicht zu setzen. Da Views keine Antwortobjekte zurückgeben müssen, sondern einen Wert zurückgeben können, der von Flask selbst in ein Antwortobjekt konvertiert wird, ist es schwierig, Header hinzuzufügen. Diese Funktion kann anstelle von aufgerufen werden Mit einem Return erhalten Sie ein Antwortobjekt, mit dem Sie Header anhängen können.

15
Devi

Diese Arbeit für mich

from flask import Flask
from flask import Response

app = Flask(__name__)

@app.route("/")
def home():
    resp = Response("")
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

if __== "__main__":
    app.run()
3
German Lopez