Flask开发服务器WSGI配置
Flask development server WSGI configuration
在生产环境中,我的 Flask 应用程序不在域根目录 运行,而是在 https://domain:port/app。 HAproxy 处理这个并终止 SSL。我想使用烧瓶开发服务器做同样的事情,但是 url_for
和 redirect
有问题。也就是说,url_for
排除了 /app
并且 redirect(url_for(...))
最终重定向到 http。
我知道在生产中,uWSGI 配置将 SCRIPT_NAME
设置为 /app
以使 url_for
正确运行。我相信它也可以将 wsgi.url_scheme
设置为 https
,但我不确定。
运行连接开发服务器时,有什么方法可以设置 WSGI 配置吗?我见过的所有解决方案都涉及自定义中间件或 ProxyFix 之类的东西,但随后我必须进行某种 if 切换以确定是否应用这些修复,因为它们是不必要的并且会中断生产。我希望有一种方法可以通过命令行调用 flask run
使用环境变量配置 WSGI 环境,以便开发和生产都使用相同的代码路径。
提前致谢!
最终编写了自定义中间件来完成这项工作。 __init__.py
:
class DevelopmentProxyFix():
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['SCRIPT_NAME'] = '/app'
environ['wsgi.url_scheme'] = 'https'
return self.app(environ, start_response)
def create_app():
app = Flask(__name__)
...
if app.config['ENV'] == "development":
app.wsgi_app = DevelopmentProxyFix(app.wsgi_app)
...
return app
在生产环境中,我的 Flask 应用程序不在域根目录 运行,而是在 https://domain:port/app。 HAproxy 处理这个并终止 SSL。我想使用烧瓶开发服务器做同样的事情,但是 url_for
和 redirect
有问题。也就是说,url_for
排除了 /app
并且 redirect(url_for(...))
最终重定向到 http。
我知道在生产中,uWSGI 配置将 SCRIPT_NAME
设置为 /app
以使 url_for
正确运行。我相信它也可以将 wsgi.url_scheme
设置为 https
,但我不确定。
运行连接开发服务器时,有什么方法可以设置 WSGI 配置吗?我见过的所有解决方案都涉及自定义中间件或 ProxyFix 之类的东西,但随后我必须进行某种 if 切换以确定是否应用这些修复,因为它们是不必要的并且会中断生产。我希望有一种方法可以通过命令行调用 flask run
使用环境变量配置 WSGI 环境,以便开发和生产都使用相同的代码路径。
提前致谢!
最终编写了自定义中间件来完成这项工作。 __init__.py
:
class DevelopmentProxyFix():
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['SCRIPT_NAME'] = '/app'
environ['wsgi.url_scheme'] = 'https'
return self.app(environ, start_response)
def create_app():
app = Flask(__name__)
...
if app.config['ENV'] == "development":
app.wsgi_app = DevelopmentProxyFix(app.wsgi_app)
...
return app