问题描述:项目用的是flask框架,在项目上线的时候,服务器上是使用gunicorn来启动项目的。但是上线之后,发现服务成功启动了,也有正确的返回值,但是没有生成日志,而用python来启动服务的时候,是会生成日志的。

下面是要上线的服务的入口文件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是一个工具方法,用来初始化日志。

gunicorn启动服务的时候是用下面的命令启动的:

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

问题的原因:Python只有在这个脚本是Python解释器的入口文件的时候,才会把它的__name__的值置为'__main__',但是用gunicorn启动的时候,这个脚本是被用import导入了,所以对于Python解释器来说,这个脚本根本就不是入口文件,所有__name__的值不等于'__main__',所有也就不会执行if __name__ == '__main__'里面的代码块。而用Python启动的时候,这个文件就是Python解释器的入口文件。

那么问题来了,为什么这两行代码没有执行,服务还是可以起来呢,因为对gunicorn来说,它只要知道app是哪个就可以了,不需要知道其它,而上面的那条用gunicorn启动服务的命令中,已经指定了ip和端口号,所以服务可以成功启动起来。而且如果把代码放到外面,写成下面的这种形式也是会报错的:

from xxx import app   # app = Flask(__name__)

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

这里报错是因为gunicorn的那条命令已经启动了一个app了,然后app.run(host='0.0.0.0', port=8000, threaded=True)这行代码又要启动一个app,端口被占用了。

所以最好写成下面这种方式,这样的话就可以兼容gunicorn和python启动两种方式。

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)

gunicorn启动flask项目的坑的更多相关文章

  1. 跨过Nginx上基于uWSGI部署Django项目的坑

    先说说他们的关系,Nginx和uWSGI都是Web服务器,Nginx负责静态内容,uWSGI负责Python这样的动态内容,二者配合共同提供Web服务以实现提高效率和负载均衡等目的.uWSGI实现了多 ...

  2. dajie项目的坑

    1.首先IDEA巨坑无比的地方是引入时,只要哪怕一个依赖下载不到,就会长期阻塞,删除.重新引入都没用!! 2.注释掉项目及其子项目中所有pom.xml中引用的spring仓库,否则即使maven配置阿 ...

  3. 记一次 gunicorn 启动 flask 出问题的经历

    出错现象: gunicorn+nginx+flask 部署项目, 部署过程没问题,项目也正常启动了,但是一旦访问接口,就会报错: Traceback (most recent call last): ...

  4. eclipse 打包maven项目的坑

    一.问题: 公司开发了一个项目,需要作为后台服务运行,整个项目的构成是:[maven + spring + eclipse] 在使用打包的时候遇到许多问题: (1)eclipse中maven工具的集成 ...

  5. 在idea中编写自动拉取、编译、启动springboot项目的shell脚本

    idea 开发环境搭建 idea中安装shell开发插件 服务器具备的条件 已经安装 lsof(用于检查端口占用) 已安装 git 安装 maven 有 java 环境 背景 代码提交到仓库后,需要在 ...

  6. vue开发项目的坑

    [Vue warn]: Do not use built-in or reserved HTML elements as component id: MenuItem [Vue warn]: Do n ...

  7. jenkins启动java项目的jar包总是退出

    参考文档: https://www.cnblogs.com/DFX339/p/8241253.htmlhttps://blog.csdn.net/windanchaos/article/details ...

  8. Jmeter与LoadRunner 测试Java项目的坑

    32位的JDK,Jmeter.bat 最大内存只能配置1G,测不了大并发,所以用Jmeter测试时一定要改成64位的Jmeter用LR测试java程序的时候必须用32位的JDK 环境变量 在path的 ...

  9. vue-cli搭建项目的坑

    使用vue-cli生成的项目默认没有 --open,所以npm run dev运行项目后,不会自动打开浏览器, 需要手动添加--open,反之,如果不需要自动打开浏览器,删除就好了

随机推荐

  1. lsof 命令用法详解

    lsof 命令用法详解 作用 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所 ...

  2. error #10234-D: unresolved symbols remain error #10010: errors encountered during linking;

    error #10234-D: unresolved symbols remain error #10010: errors encountered during linking;: include ...

  3. jS弹出新窗口被拦截的解决方法

    使用ajax处理数据,在回调中跳转到或打开新页面,这时就会被浏览器拦截 解决方案:先用window.open打开一个窗口,然后修改该窗口地址 var w = window.open('about:bl ...

  4. 前段学习的roadmap

    引自http://www.cnblogs.com/IMxinu/p/9693041.html

  5. Oracle入门之对表内容的dml操作

    oracle表的管理--添加数据 使用insert语句向表中插入数据 插入数据基本语法: insert into table[(column [,column...])] values(value [ ...

  6. 第九章:Servlet工作原理解析

    9.1 从Servlet容器说起 Servlet和Servlet容器的关系,就像枪和子弹的关系,彼此依存又互相独立发展,这一切都是为了适应工业化生产.从技术角度来说,是为了解耦,通过标准化接口来互相协 ...

  7. EOJ Monthly 2019.2 题解(B、D、F)

    EOJ Monthly 2019.2 题解(B.D.F) 官方题解:https://acm.ecnu.edu.cn/blog/entry/320/ B. 解题 单测试点时限: 2.0 秒 内存限制:  ...

  8. js循环出相同name,不同id的按钮,对其进行点击回复操作

    function getseat(){ var option= "<button class='btn'style='margin:5px;' onclick='onclickSeat ...

  9. 在Raspbian Stretch系统上设置Home Assistant开机启动

    较新的Linux发行版趋向于用systemd管理守护进程,如果您不确定系统是否正在使用systemd,您可以使用以下命令进行检查: -o comm= 如果上述命令返回字符串systemd,说明系统正在 ...

  10. bilibili答题器

    2017-06-12,靠着这个测试版我得以95分的成绩L0级晋级会员L2级(PS 测试两次分别获得 攻略组和 学霸组) 计划完善目标: 界面UI更新布局,现在这个布局真是** 答案和问题分开,增加语音 ...