【问题标题】:Flask development server WSGI configurationFlask 开发服务器 WSGI 配置
【发布时间】:2020-12-04 22:34:09
【问题描述】:

在生产中,我的烧瓶应用程序不是在域根目录下运行,而是在 https://domain:port/app 上运行。 HAproxy 处理此问题并终止 SSL。我想使用烧瓶开发服务器做同样的事情,但遇到url_forredirect 的问题。即url_for 不包括/appredirect(url_for(...)) 最终重定向到http。

我了解在生产中,uWSGI 配置将SCRIPT_NAME 设置为/app 以使url_for 正常运行。我相信它也可以将wsgi.url_scheme 设置为https,但我不确定。

在运行开发服务器时有什么方法可以设置 WSGI 配置?我见过的所有解决方案都涉及自定义中间件或 ProxyFix 之类的东西,但是我必须做一些 if 切换来确定是否应用这些修复,因为它们是不必要的并且会破坏生产。我希望有一种方法可以通过命令行调用flask run 来使用环境变量配置WSGI 环境,以便开发和生产都使用相同的代码路径。

提前致谢!

【问题讨论】:

  • youtube.com/…这个视频可能对你有帮助
  • 我不是烧瓶专家,但url_for 的文档显示您可以将_external=True,_scheme="https" 添加到url_for() 调用中。也许这可以解决您的问题?
  • 我真的不想为了让某些东西在开发中工作而在代码中乱扔额外的参数。我正在寻找相当于 uWSGI 配置的 werkzeug。

标签: python flask reverse-proxy wsgi haproxy


【解决方案1】:

最终编写了一个自定义中间件来完成这项工作。 __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

【讨论】: