将 Flask 部署在子目录中

和前几篇工作一样,都是同一个项目里面遇到的坑…… A.K.A,给 Flask 应用加一个全局前缀。


由于一些原因,我不能将自己的 Flask 项目部署到根目录里,只能子目录部署。

本来是个比较简单的事儿:flask 的 app 用个 BluePrint 包一下就行了啊……但是我不想写得那么入侵,就在找有啥比较「不入侵」的方法。

我的项目是用 gunirorn 启动的。gunicorn 支持一个叫 SCRIPT_NAME 的环境变量。比如,你的网站域名是 abc.com ,想然后设置了 SCRIPT_NAMEdef,然后访问 abc.com/def/123 那么 gunicorn 会将 def 认为是 SCRIPT_NAME ,处理的时候会将 SCRIPT_NAME 给干掉,剩下 123 传给 Flask。或者说,相当于自己做了 nginx 的 rewrite ^/SCRIPT_NAME/(.*)$ /$1 break

所以解决办法是:

  1. 【和下面的 2 二选一】部署的时候,设置 SCRIPT_NAME 环境变量为你想要的全局前缀,例如 SCRIPT_NAME=/some_prefix
  2. 【和上面的 1 二选一】nginx 设置 uwsgi_param SCRIPT_NAME /some_prefix
  3. 去掉 nginx 的 rewrite ^/some_prefix/(.*)$ /$1 break 设置

嗯,就这样。

当然,也被坑过……见 Twitter:

被内部轮子折磨一周……
想把 flask 部署在子目录里。内部🐲🦄️死活用不了 script_name 这个环境变量。查了一周了都没啥进展(查 flask 代码、nginx 啥的)。最后灵光一闪,🐲🦄️是 g🦄️的轻量包装,那么直接用 g🦄️?
emmm,成功了

然后最后部署的时候,海外可以部署成功,国内死活部署不了……

成吧……就这样吧……先用 Trick 顶上了。

发表评论