如何在Flask中设置响应头?

这是我的代码:

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

但是,当我从浏览器请求我的服务器时,我得到这个错误:

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

我也尝试过这种方法,在请求之后设置响应头:

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

没有骰子。 我犯了同样的错误。 有没有办法在路由function中设置响应头? 像这样的东西将是理想的:

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

但我无法find这样做。 请帮忙。

编辑

如果我用一个POST请求curl url:

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

我得到这个回应:

 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> 

有任何想法吗?

你可以很容易地做到这一点:

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

看一下flask.Response和flask.make_response()

但有些事情告诉我你还有另一个问题,因为after_request应该正确处理它。

编辑
我只注意到你已经在使用make_response ,这是做这件事的方法之一。 就像我之前说过的那样, after_request应该起作用。 尝试通过curl击中端点并查看标题是什么:

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

你应该看看

 > 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 

注意Access-Control-Allow-Origin标题。

编辑2
正如我怀疑的那样,你得到了500,所以你不像你想象的那样设置标题。 尝试添加app.debug = True然后再启动应用程序。 你应该得到一些输出显示你的问题的根源。

例如:

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

给出一个很好格式化的html错误页面,在底部(有助于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 

使用Flask的make_response类似

 @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 

从烧瓶文件 ,

flask.make_response(*参数)

有时需要在视图中设置其他标题。 由于视图不必返回响应对象,但可以返回由Flask本身转换为响应对象的值,因此向它添加标题变得非常棘手。 这个函数可以被调用而不是使用返回,你将得到一个响应对象,你可以使用它来附加头文件。

这为我工作

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