Han*_*loo 10 python flask foreman
我知道Flask在调试模式下会检测.py源代码文件的更改,并在新请求进入时重新加载它们.
我曾经一直在我的应用程序中看到这个.在我的views.py文件中更改@ app.route装饰部分中的一个小文本,我可以在刷新时看到浏览器中的更改.
但突然间(不记得发生了什么变化),这似乎不再起作用了.
问:我哪里错了?
我在OSX 10.9系统上运行,使用Python 2.7进行VENV设置.我foreman start在我的项目根目录中使用它来启动它.
应用程序结构如下:
[Project Root]
+-[app]
| +-__init__.py
| +- views.py
| +- ...some other files...
+-[venv]
+- config.py
+- Procfile
+- run.py
Run Code Online (Sandbox Code Playgroud)
文件看起来像这样:
# Procfile
web: gunicorn --log-level=DEBUG run:app
Run Code Online (Sandbox Code Playgroud)
# config.py
contains some app specific configuration information.
Run Code Online (Sandbox Code Playgroud)
# run.py
from app import app
if __name__ == "__main__":
app.run(debug = True, port = 5000)
Run Code Online (Sandbox Code Playgroud)
# __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
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
eri*_*rik 10
正如其他答案中所述,这里的问题是,它看起来像你搬到python run.py了foreman start,或者你改变Procfile了
# Procfile
web: python run.py
Run Code Online (Sandbox Code Playgroud)
至
# Procfile
web: gunicorn --log-level=DEBUG run:app
Run Code Online (Sandbox Code Playgroud)
运行时foreman start,它只运行您在中指定的命令Procfile.(我猜你正在和Heroku一起工作,但即便没有,这很好,因为它会模仿你的服务器上运行的东西/ Heroku dyno /无论如何.)
所以现在,当你运行gunicorn --log-level=DEBUG run:app(via foreman start)时,你现在正在运行你的应用程序,gunicorn而不是随附的内置web服务器Flask.该run:app参数告诉gunicorn我们寻找run.py一个Flask名为的实例app,导入它并运行它.这是它变得有趣的地方:因为run.py正在导入,__name__ == '__main__'所以False(这里有更多内容),所以app.run(debug = True, port = 5000)永远不会被调用.
这就是你想要的(至少在一个公开可用的设置中),因为调用Flask时使用的内置的web服务器app.run()有一些非常严重的安全漏洞.该--log-level=DEBUG还可以有点自欺欺人,因为它使用单词"调试",但它只是告诉gunicorn日志报表打印,并且要忽略的(检查出的日志记录Python文档.)
解决方案是python run.py在本地运行应用程序并在其上进行工作/调试时运行,并且仅foreman start在您想要模拟生产环境时运行.此外,由于gunicorn只需要导入app对象,您可以删除一些歧义并将您更改Procfile为
# Procfile
web: gunicorn --log-level=DEBUG app:app
Run Code Online (Sandbox Code Playgroud)
您还可以查看Flask Script,它具有内置命令python manage.py runserver,可在调试模式下运行内置的Flask Web服务器.
解决方案是foreman start按照评论中所述停止使用并直接执行python run.py.
这样,app.run带有debug=True和use_reloader=True配置参数的方法就生效了。
示例应用程序,其中app是我们的应用程序,该应用程序已保存在文件start.py中:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hallo():
return 'Hello World, this is really cool... that rocks... LOL'
Run Code Online (Sandbox Code Playgroud)
现在我们使用--reload标志从 shell 启动应用程序
gunicorn -w 1 -b 127.0.0.1:3032 start:app --reload
Run Code Online (Sandbox Code Playgroud)
并且gunicorn会在文件自动更改时重新加载应用程序。根本不需要改变任何东西。
如果您想在后台运行此应用程序,请添加标志-D
gunicorn -D -w 1 -b 127.0.0.1:3032 start:app --reload
Run Code Online (Sandbox Code Playgroud)
-D 恶魔模式
-w 工人数量
-b 地址和端口
启动(start.py):app - 应用程序
--reload Gunicorns 文件监控
查看设置文件: http://docs.gunicorn.org/en/latest/settings.html
那里提到了所有选项和标志。玩得开心!