当前位置: 首页 > 面试题库 >

如何在Flask中设置响应头?

凌景辉
2023-03-14
问题内容

这是我的代码:

@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

没有骰子。我犯了同样的错误。有没有一种方法可以只在route函数中设置响应头?这样的事情将是理想的:

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

但我还是找不到这样做。请帮忙。

编辑

如果我使用POST请求卷曲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.Responseflask.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


 类似资料:
  • 我有一个无服务器API,它与无服务器框架版本1.25一起工作 由于安全原因,我想添加响应头。请帮助我如何通过serverless.yml文件设置下面的标题。出于安全考虑,有必要添加此标题吗? 内容-安全-策略:包括默认-src“自我” •严格的交通安全最大年龄=31536000;包括子域;预载 •X-Content-Type-Options:nosniff •X-XSS-保护:1 •缓存控制:最大

  • 有一个需要实现的REST APIendpoint用于获取一些信息并将后端请求发送到另一个服务器,来自后端服务器的响应必须设置为最终响应。我的问题是如何在javax.ws.rs.core.响应中设置响应体? 这里的消息是我需要设置的。但是我尝试了几种方法。没有一个奏效。

  • 这是我的代码: 但是,当我从浏览器向服务器发出请求时,会出现以下错误: 我也尝试过这种方法,在请求之后设置响应头: 没有骰子。我得到同样的错误。有没有办法只在路由函数中设置响应头?像这样的东西是理想的: 但是我无论如何也找不到这样做。请帮忙。 编辑 如果我卷曲的url与POST请求这样: 我得到的答复是: 有什么想法吗?

  • 问题内容: 例如,此URL: 应该返回一个类型的响应。我有两个静态图片, 如果type为1,则应该返回,否则返回。在烧瓶中怎么做? 问题答案: 你使用类似 发送回或,具体取决于类型查询参数。有关更多信息,请参见函数和对象的文档。

  • 在我的java项目中,我想提供一个下载word文件的函数。当我输出默认文件名时,大写的英文字符将自动转换为小写。我怎样才能解决这个问题。 我该怎么修好它?

  • 问题内容: 我需要将CORS设置为在express服务的脚本上启用。如何为公共/资产在这些返回的响应中设置标题? 问题答案: npm上至少有一个中间件用于处理Express中的CORS:cors。[请参阅@mscdex答案] 这是从ExpressJS DOC 设置自定义响应头的方法 将标题字段设置为值 或传递一个对象以一次设置多个字段。 别名为