Python 如何在Flask应用程序中获取代理方案?

Python 如何在Flask应用程序中获取代理方案?,python,flask,nginx-reverse-proxy,Python,Flask,Nginx Reverse Proxy,我有一个运行在NGINX反向代理后面的Flask应用程序。在我的一个函数中,我需要构造一个指向不同服务的URL,并且我希望将HTTP方案与NGINX条目方案匹配。因此,如果NGINX反向代理一个https请求,我想生成一个类似https://my_other_service。但是如果NGINX反向代理一个http,我希望它是http://my_other_service 当我在同一个应用程序中将代理方案用于端点时,的flask.url_函数能够自动确定代理方案,因此我认为这是可能的,但在我的情况

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

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

如何确定flask应用程序中的代理方案?

因为,在生成url时,您可以直接告诉
url\u使用特定方案:

'secure\u thingy'的
url\u,
_外部=真,
_scheme='https',
视图arg1=1,…)
当然,问题是您不一定知道URL是否应该是https。如果它在生产中落后于Nginx,那么它必须是https。如果它运行在本地主机上进行本地开发,那么https可能无法工作

一种解决方案是,只需为应用程序设置使用哪种方案的配置。在您的开发环境中,它将被设置为http。在您的生产环境中,您应该使用https。这就是我要做的

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

这里有一个例子:

location /some/path/ {
    proxy_set_header X-Force-Https "yes";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://localhost:8000;
}
然后在您的Flask代码中,如果
请求.headers.get('X-Force-https',None)='yes',则只将
\scheme='https'
传递给
url\u

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