【问题标题】:How do I get the proxy scheme inside a Flask app?如何在 Flask 应用程序中获取代理方案?
【发布时间】:2020-11-06 16:28:54
【问题描述】:

我有一个在 NGINX 反向代理后面运行的 Flask 应用程序。在我的一个函数中,我需要构建一个指向不同服务的 URL,并且我希望将 HTTP 方案与 NGINX 入口方案相匹配。因此,如果 NGINX 正在反向代理 https 请求,我想生成一个类似 https://my_other_service 的 url。但如果 NGINX 反向代理 http,我希望它是 http://my_other_service

flask.url_for 函数在我将其用于同一应用程序中的端点时能够自动确定代理方案,所以我认为这一定是可能的,但在我的情况下,我生成的 url 不是端点当前的 Flask 应用程序。

如何确定烧瓶应用中的代理方案?

【问题讨论】:

    标签: python flask nginx-reverse-proxy


    【解决方案1】:

    作为described on this question,您可以直接告诉url_for在生成URL时使用特定的方案:

    url_for('secure_thingy',
            _external=True,
            _scheme='https',
            viewarg1=1, ...)
    

    当然,问题在于您不一定知道 URL 是否应该是 https。如果它在生产中运行在 Nginx 后面,它必须是 https。如果它在 localhost 上运行以进行本地开发,那么 https 可能不起作用。

    一种解决方案是为您的应用设置一个关于使用何种方案的配置设置。在您的开发环境中,它将设置为 http。在您的生产环境中,您将使用 https。这就是我会做的。

    另一种方法是告诉 Nginx 传递一个特殊的标头,然后您可以使用它来更改方案。

    instructions on adding headers on the Nginx site,所以这里是一个例子:

    location /some/path/ {
        proxy_set_header X-Force-Https "yes";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:8000;
    }
    

    然后在您的 Flask 代码中,仅在 request.headers.get('X-Force-Https', None) == 'yes' 时将 _scheme='https' 传递给 url_for

    这是一个更加自动化的解决方案,但需要您修改生产 Web 服务器环境。

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多