问题描述
在生产中,我的flask应用程序不是在域根目录上运行,而是在https:// domain:port / app上运行。 HAproxy会处理此问题并终止SSL。我想使用flask开发服务器执行相同的操作,但是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