源代码更改时自动重新加载Flask应用程序

时间:2014-05-01 01:03:42

标签: python flask foreman

我知道Flask在调试模式下会检测.py源代码文件的更改,并在新请求进入时重新加载它们。

我曾经一直在我的应用中看到这个。在我的views.py文件中更改@ app.route装饰部分中的一个小文本,我可以在刷新时看到浏览器中的更改。

但突然之间(无法记住发生了什么变化),这似乎不再适用。

问:我哪里出错了?

我在OSX 10.9系统上运行,使用Python 2.7进行VENV设置。我在项目根目录中使用foreman start来启动它。

App结构是这样的:

[Project Root]
+-[app]
| +-__init__.py
| +- views.py
| +- ...some other files...
+-[venv]
+- config.py
+- Procfile
+- run.py

文件如下所示:

# Procfile
web: gunicorn --log-level=DEBUG run:app
# config.py
contains some app specific configuration information.
# run.py
from app import app

if __name__ == "__main__":
    app.run(debug = True, port = 5000)
# __init__.py
from flask import Flask
from flask.ext.login import LoginManager
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.mail import Mail
import os

app = Flask(__name__)
app.config.from_object('config')

db = SQLAlchemy(app)

#mail sending
mail = Mail(app)

lm = LoginManager()
lm.init_app(app)
lm.session_protection = "strong"

from app import views, models
# app/views.py
@app.route('/start-scep')
def start_scep():
    startMessage = '''\
<html>
<header>
<style>
body { margin:40px 40px;font-family:Helvetica;}
h1 { font-size:40px; }
p { font-size:30px; }
a { text-decoration:none; }
</style>
</header>

<p>Some text</p>
</body>
</html>\
'''
    response = make_response(startMessage)
    response.headers['Content-Type'] = "text/html"
    print response.headers
    return response

3 个答案:

答案 0 :(得分:10)

此处的问题,如其他答案中所述,看起来您已从python run.py移至foreman start,或者您已从<{p>}更改了Procfile

# Procfile
web: python run.py

# Procfile
web: gunicorn --log-level=DEBUG run:app

当您运行foreman start时,它只会运行您在Procfile中指定的命令。 (我猜你会和Heroku一起工作,但即使不是,这也很好,因为它会模仿你的服务器/ Heroku dyno上运行的东西/无论如何。)

现在,当您运行gunicorn --log-level=DEBUG run:app(通过foreman start)时,您现在使用gunicorn而不是Flask附带的内置网络服务器运行您的应用程序。 run:app参数告诉gunicornrun.py查找名为Flask的{​​{1}}实例,导入并运行它。这是有趣的地方:自导入app后,run.py__name__ == '__main__'(请参阅here上的详情),以及{{1}永远不会被调用。

这就是您想要的(至少在公开可用的设置中),因为False中使用的app.run(debug = True, port = 5000)内置的网络服务器是被称为有一些相当严重的安全漏洞。 Flask也可能有点欺骗,因为它使用了单词&#34; DEBUG&#34;但它只告诉app.run()要打印哪些日志语句以及要忽略哪些日志语句(请查看Python docs on logging。)

解决方案是在本地运行应用程序并在其上进行工作/调试时运行--log-level=DEBUG,并且只在您想要模仿生产环境时运行gunicorn。另外,由于python run.py只需要导入foreman start对象,因此您可以删除一些歧义并将gunicorn更改为

app

您还可以查看具有内置命令Procfile的{​​{3}},该命令在调试模式下运行内置的Flask Web服务器。

答案 1 :(得分:4)

解决方案是停止使用评论中所述的foreman start并直接执行python run.py

这样,app.rundebug=True配置参数的use_reloader=True方法生效。

答案 2 :(得分:2)

示例应用应用是我们的应用,此应用已保存在文件 start.py 中:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hallo():
    return 'Hello World, this is really cool... that rocks... LOL'

现在我们从shell启动应用程序,标志为 - reload

gunicorn -w 1 -b 127.0.0.1:3032 start:app --reload

和gunicorn在文件自动更改时重新加载应用程序。无需改变任何东西。

如果您喜欢在后台运行此应用程序,请添加标记 -D

gunicorn -D -w 1 -b 127.0.0.1:3032 start:app --reload
  

-D恶魔模式

     

-w数量的工人

     

-b地址和端口

     

start(start.py):app - application

     

- 重新加载gunicorns文件监控

查看设置文件: http://docs.gunicorn.org/en/latest/settings.html

那里提到了所有选项和标志。玩得开心!