Flask Gunicorn 应用无法让 __name__ 等于 '__main__
我在这个文件 /home/myname/myapp/app.py
里有一些代码:
from flask import Flask
app = Flask(__name__)
print __name__
@app.route('/')
def index():
return "Hello world!"
if __name__ == '__main__':
print 'in if'
app.run()
当我运行这个命令:
$ gunicorn app:app -b 127.0.0.2:8000
它显示:
2013-03-01 11:26:56 [21907] [INFO] Starting gunicorn 0.17.2
2013-03-01 11:26:56 [21907] [INFO] Listening at: http://127.0.0.2:8000 (21907)
2013-03-01 11:26:56 [21907] [INFO] Using worker: sync
2013-03-01 11:26:56 [21912] [INFO] Booting worker with pid: 21912
app
所以这个应用的 __name__
是 app
,而不是我需要的 __main__
,这样我就无法执行那个条件语句了。
我试着在这个目录里放了一个空的 __init__.py
文件。下面是我的 nginx sites-enabled default
配置:
server {
#listen 80; ## listen for ipv4; this line is default and implied
#listen [::]:80 default_server ipv6only=on; ## listen for ipv6
root /home/myname/myapp;
# Make site accessible from http://localhost/
server_name localhost;
location / {
proxy_pass http://127.0.0.2:8000;
}
}
编辑
... 虽然这个应用在我访问网站时确实会打印'Hello world'
,但关键是我需要 __name__
等于 '__main__'
。我还想知道为什么它不是这样,以及如何让它等于 __main__
。
编辑 2
... 我刚刚意识到我不需要运行app.run()
,因为这正是 Gunicorn 的作用。真是的。不过我还是想弄清楚为什么 __name__
不是 '__main__'
。
1 个回答
17
当你运行一个Python脚本时,如果这个脚本是程序的入口点,Python会把一个叫做__name__
的东西设置为"__main__"
。但是,当你用Gunicorn来运行这个脚本时,它会先把这个脚本导入进来,这样这个脚本就不是入口点了,因此__name__
不会被设置为"__main__"
。