和前几篇工作一样,都是同一个项目里面遇到的坑…… 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顶上了。
发表回复