gunicorn啟動(dòng)flask項(xiàng)目的坑

問題描述:項(xiàng)目用的是flask框架,在項(xiàng)目上線的時(shí)候,服務(wù)器上是使用gunicorn來啟動(dòng)項(xiàng)目的。但是上線之后,發(fā)現(xiàn)服務(wù)成功啟動(dòng)了,也有正確的返回值,但是沒有生成日志,而用python來啟動(dòng)服務(wù)的時(shí)候,是會生成日志的。

下面是要上線的服務(wù)的入口文件server.py的主要代碼塊:

from xxx import app   # app = Flask(__name__)

if __name__ == '__main__':
    log_init('xx', 'xxx')
    app.run(host='0.0.0.0', port=8000, threaded=True)

log_init是一個(gè)工具方法,用來初始化日志。

gunicorn啟動(dòng)服務(wù)的時(shí)候是用下面的命令啟動(dòng)的:

~/anaconda/envs/my_py3/bin/gunicorn -w 5 -b 0.0.0.0:8000 --threads 6 server:app

問題的原因:Python只有在這個(gè)腳本是Python解釋器的入口文件的時(shí)候,才會把它的__name__的值置為'__main__',但是用gunicorn啟動(dòng)的時(shí)候,這個(gè)腳本是被用import導(dǎo)入了,所以對于Python解釋器來說,這個(gè)腳本根本就不是入口文件,所有__name__的值不等于'__main__',所有也就不會執(zhí)行if __name__ == '__main__'里面的代碼塊。而用Python啟動(dòng)的時(shí)候,這個(gè)文件就是Python解釋器的入口文件。

那么問題來了,為什么這兩行代碼沒有執(zhí)行,服務(wù)還是可以起來呢,因?yàn)閷unicorn來說,它只要知道app是哪個(gè)就可以了,不需要知道其它,而上面的那條用gunicorn啟動(dòng)服務(wù)的命令中,已經(jīng)指定了ip和端口號,所以服務(wù)可以成功啟動(dòng)起來。而且如果把代碼放到外面,寫成下面的這種形式也是會報(bào)錯(cuò)的:

from xxx import app   # app = Flask(__name__)

log_init('xx', 'xxx')
app.run(host='0.0.0.0', port=8000, threaded=True)

這里報(bào)錯(cuò)是因?yàn)間unicorn的那條命令已經(jīng)啟動(dòng)了一個(gè)app了,然后app.run(host='0.0.0.0', port=8000, threaded=True)這行代碼又要啟動(dòng)一個(gè)app,端口被占用了。

所以最好寫成下面這種方式,這樣的話就可以兼容gunicorn和python啟動(dòng)兩種方式。

from xxx import app   # app = Flask(__name__)

log_init('xx', 'xxx')
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, threaded=True)

參考資料:

  1. https://stackoverflow.com/questions/15156758/flask-gunicorn-app-cant-get-name-to-equal-main
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容