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?
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
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.
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()