我知道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
答案 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
参数告诉gunicorn
在run.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.run
和debug=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
那里提到了所有选项和标志。玩得开心!