和前几篇工作一样,都是同一个项目里面遇到的坑…… A.K.A,给 Flask 应用加一个全局前缀。
由于一些原因,我不能将自己的 Flask 项目部署到根目录里,只能子目录部署。
本来是个比较简单的事儿:flask 的 app
用个 BluePrint 包一下就行了啊……但是我不想写得那么入侵,就在找有啥比较「不入侵」的方法。
我的项目是用 gunirorn 启动的。gunicorn 支持一个叫 SCRIPT_NAME
的环境变量。比如,你的网站域名是 abc.com
,想然后设置了 SCRIPT_NAME
为 def
,然后访问 abc.com/def/12
3 那么 gunicorn 会将def 认为是 SCRIPT_NAME ,处理的时候会将 SCRIPT_NAME 给干掉,剩下 123
传给 Flask。或者说,相当于自己做了 nginx 的 rewrite ^/SCRIPT_NAME/(.*)$ /$1 break
。
所以解决办法是:
- 【和下面的 2 二选一】部署的时候,设置
SCRIPT_NAME
环境变量为你想要的全局前缀,例如SCRIPT_NAME=/some_prefix
- 【和上面的 1 二选一】nginx 设置
uwsgi_param SCRIPT_NAME /some_prefix
- 去掉 nginx 的
rewrite ^/some_prefix/(.*)$ /$1 break
设置
嗯,就这样。
当然,也被坑过……见 Twitter:
被内部轮子折磨一周……
想把 flask 部署在子目录里。内部🐲🦄️死活用不了 script_name 这个环境变量。查了一周了都没啥进展(查 flask 代码、nginx 啥的)。最后灵光一闪,🐲🦄️是 g🦄️的轻量包装,那么直接用 g🦄️?
emmm,成功了
然后最后部署的时候,海外可以部署成功,国内死活部署不了……
成吧……就这样吧……先用 Trick 顶上了。
发表回复