如何在Flask中设置响应头? [英] How do I set response headers in Flask?

查看:1463
本文介绍了如何在Flask中设置响应头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的代码:

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

但是,当我从浏览器向我的服务器发出请求时,出现以下错误:

  XMLHttpRequest无法加载http:// localhost:5000 / hello。 
否请求的资源上存在Access-Control-Allow-Origin标题。

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



$ p $ @ app.after_request
def add_header(响应):
response.headers ['Access-Control-Allow-Origin '] ='*'
返回响应

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

$ p $ @ app.route('/ hello',methods = [POST])
def hello(响应):#是这个东西吗?
response.headers ['Access-Control-Allow-Origin'] ='*'
返回响应

但无论如何我无法找到这样做。请帮忙。

编辑

像这样:
$ b $ pre $ curl -iX POST http:// localhost:5000 / hello


我得到这个回应:

pre $ HTTP $ / 1.0 500内部服务器错误
内容类型:text / html
内容长度:291
服务器:Werkzeug / 0.9.6 Python / 2.7.6
日期:星期二,16 9月2014 03:58:42 GMT

<!DOCTYPE HTML PUBLIC - // W3C // DTD HTML 3.2 Final // EN>
< title> 500内部伺服器错误< / title>
< h1>内部伺服器错误< / h1>
< p>服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序出现错误。< / p>

有什么想法?

解决方案


$ b

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

请看 flask.Response flask.make_response() a>



但是有些东西告诉我你还有另一个问题,因为 after_request 也应该正确处理它。 / b>

编辑

我刚注意到你已经在使用 make_response 这是做到这一点的方法之一。就像我之前说过的那样, after_request 应该也能工作。尝试通过curl点击端点并查看标题:

$ $ $ $ $ $ $ $ curl -i http://127.0.0.1:5000/您的/端点

您应该看到

 > 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:*
服务器:Werkzeug / 0.8.3 Python / 2.7.5
日期:Tue ,2014年9月16日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命令有用)

$ p $ Traceback (最近一次调用最后一次):
...
文件/private/tmp/min.py,第8行,在home
user.weapon = boomerang
NameError:全球名称boomerang未定义


This is my code:

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

However, when I make a request from the browser to my server I get this error:

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

I have also tried this approach, setting the response headers "after" the request:

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

No dice. I get the same error. Is there a way to just set the response headers in the route function? Something like this would be ideal:

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

but I cant find anyway to do this. Please help.

EDIT

if I curl the url with a POST request like so:

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

I get this response:

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>

Any ideas?

解决方案

You can do this pretty easily:

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

Look at flask.Response and flask.make_response()

But something tells me you have another problem, because the after_request should have handled it correctly too.

EDIT
I just noticed you are already using make_response which is one of the ways to do it. Like I said before, after_request should have worked as well. Try hitting the endpoint via curl and see what the headers are:

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

You should see

> 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

Noting the Access-Control-Allow-Origin header.

EDIT 2
As I suspected, you are getting a 500 so you are not setting the header like you thought. Try adding app.debug = True before you start the app and try again. You should get some output showing you the root cause of the problem.

For example:

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

Gives a nicely formatted html error page, with this at the bottom (helpful for curl command)

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中设置响应头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆