微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flask CORS 有时有效,有时无效

如何解决Flask CORS 有时有效,有时无效

我在 Tornado Wsgi 容器中部署了一个 Flask 应用程序。 Tornado 服务器托管在 http://localhost:5000 上。这整个事情是使用 Nginx 反向代理部署的。 Flask 通过 CORS 将其端点提供给 Tornado 服务器:

app = Flask(__name__)
cors = CORS(app,resources={r"/*": {"origins": "*"}})
app.config['CORS_HEADERS'] = ['Content-Type','Authorization']
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0

flask 应用的部署方式如下:

flask_app = tornado.wsgi.WsgiContainer(app)
tornado_app = tornado.web.Application(
    [   
        # tornado specific handlers,(r"/(.*)",tornado.web.FallbackHandler,dict(fallback=flask_app))
    ],log_function=log_function,websocket_max_message_size=100 * 1024 * 1024)
http_server = tornado.httpserver.HTTPServer(
    tornado_app,max_buffer_size=1024 ** 3,)

这是我的 Nginx 配置:

upstream frontend {
    server localhost:5000;
}

gzip on;
gzip_types text/plain text/css text/xml
           application/x-javascript application/xml
           text/javascript;

proxy_next_upstream error;

server {
    listen <server_ip>:80;
    server_name <server_hostname>;

    auth_basic "Administrator's Area";
    auth_basic_user_file /etc/Nginx/.htpasswd;

    location / {
        proxy_pass http://frontend/;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-Scheme $scheme;
    }
}

当我使用 Nginx 反向代理时,所有烧瓶端点都出现 CORS: Request did not succeed 错误。如果没有它,localhost:5000 的 Tornado 服务器会接受所有的 Flask 路由。有时,它会自行工作,有时则不会。大多数情况下,是后者。我还尝试在 Nginx 配置中设置特定于 cors 的标头,但它不起作用。

解决方法

花了很多时间来解决这个问题,但我很高兴提出一个解决方案(以防有人发现)。实际上,我不再需要使用 flask-CORS。在部署中,来源始终相同,即 <server_hostname><server_ip>。解决步骤:

  1. 删除了 Flask 应用程序中的 cors 和配置行
  2. 在我的 tornado 应用程序中,我像这样替换了烧瓶路线:
http://localhost:5000/flask_app
# to
http://<server_hostname>/flask_app
  1. 如果您在 Nginx 中配置了 cors,也请删除相应的 add_header 指令。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?