Comment régler les en-têtes de réponse dans la fiole?

C'est mon code:

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

cependant, lorsque je fais une requête depuis le navigateur vers mon serveur, je reçois cette erreur:

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

j'ai également essayé cette approche, en plaçant les en-têtes de réponse " après "la requête:

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

Pas de dés. Je reçois la même erreur. Est-il un moyen de définir les en-têtes de réponse dans la fonction parcours? Quelque chose comme ceci serait idéal:

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

mais je n'arrive pas à trouver quoi que ce soit pour faire ça. S'il vous plaît aider.

MODIFIER

si je curl l'url avec une requête POST de la sorte:

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

je reçois cette réponse:

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>

des idées?

53
demandé sur dopatraman 2014-09-16 07:42:46

3 réponses

, Vous pouvez le faire assez facilement:

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

regardez la fiole .Réponse fiole et .make_response ()

mais quelque chose me dit que vous avez un autre problème, parce que le after_request aurait dû le gérer correctement aussi.

MODIFIER

Je viens de remarquer que vous utilisez déjà make_response , qui est l'un des moyens faire. Comme je l'ai déjà dit, after_request aurait dû fonctionner aussi bien. Essayez de frapper le point final via curl et voir ce que sont les en-têtes:

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

Vous devriez voir

> 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

notant l'en-tête Access-Control-Allow-Origin.

EDIT 2

Comme je m'en doutais, vous obtenez un 500 donc vous ne définissez pas l'en-tête comme vous le pensiez. Essayez d'ajouter app.debug = True avant de commencer l'application et essayer à nouveau. Vous devriez obtenir une sortie vous montrant la cause racine du problème.

par exemple:

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

donne une page d'erreur html joliment formatée, avec ceci en bas (utile pour la commande curl)

Traceback (most recent call last):
...
  File "/private/tmp/min.py", line 8, in home
    user.weapon = boomerang
NameError: global name 'boomerang' is not defined
52
répondu sberry 2014-09-16 04:17:47

utiliser make_response de fiole quelque chose comme

@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

à Partir de flacon docs ,

flacon.make_response (*args)

il est parfois nécessaire de placer des en-têtes supplémentaires dans la vue. Parce que les vues n'ont pas à retourner les objets de réponse mais peuvent retourner une valeur qui est convertie en un objet de réponse par flasque lui-même, il devient difficile d'ajouter les en-têtes. Cette fonction peut être appelée au lieu d'utiliser un retour et vous obtiendrez un objet de réponse que vous pouvez utiliser pour attacher des en-têtes.

8
répondu Devi 2017-02-06 05:08:36

ce travail pour moi

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 __name__ == "__main__":
    app.run()
2
répondu German Lopez 2016-07-27 21:48:25