问题描述:项目用的是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. spring cloud 随笔记录(1)-

    最近随着微服务的火热,我也开始对我服务进行了解了  毕竟程序员这一行需要及时更新自己的技能,才能更好的生存. 我理解的微服务  项目由多个独立运行的程序组成,每个服务运行在自己的进程中,服务间采用轻量 ...

  2. Linux系统调用列表(转)

    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...

  3. Problem C: 平面上的点和线——Point类、Line类 (III)

    Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...

  4. Ubuntu 16.04 上安装 MySQL 5.7 教程

    介绍 MySQL 是一种开源数据库管理系统,通常作为流行的LAMP(Linux,Apache,MySQL,PHP / Python / Perl)堆栈的一部分安装.它使用关系数据库和SQL(结构化查询 ...

  5. mysql的sql执行计划

    实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表.怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因此,在写 ...

  6. 左侧 随着页面滚动固定 fixed. scroll .scrollTop

    1.图片. 要求:随着页面滚动 . 左侧应该顶着 浏览器顶部, 向上回滚, 就恢复原状. 2. 代码: html <div class="all "> <!-- ...

  7. spring cloud配置高可用eureka时遇到的一些坑

    考虑到注册中心的高可用,今天搭建一下eureka集群,并在中途遇到一些小的坑,前前后后花了两个小时来排除,在这里记录一下,以供后面查看. 首先,贴上要达到的效果: 一.起两个eureka模拟集群,在D ...

  8. zabbix添加IIS网站计数器(并发连接数)详解

    环境:windows server 2012 前提:IIS上要添加好配置   1,在被监控主机,powershell输入perfmon.msc   2,点击添加按钮     3,在下拉菜单中点击小箭头 ...

  9. Can DBC 文件翻译,不是很标准,凑合看还可以

    1 引言 DBC文件描述单个CAN网络的通信.这个信息足以监测和分析网络并模拟不是物理可用的节点(剩余的总线模拟). DBC文件也可以用来开发电子控制单元的通信软件,该控制单元应该是CAN网络的一部分 ...

  10. 设置Ubuntu右侧显示扩展屏幕。。。

    sudo xrandr --output VGA1 --right-of LVDS1 --auto