gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:23:10 27 4
gpt4 key购买 nike

我知道 Flask 在 Debug模式下会检测到 .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

文件如下所示:

# 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

最佳答案

如其他答案所述,这里的问题是您似乎从 python run.py 移动到 foreman start,或者您更改了 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 中查找名为 app 的 Flask 实例,导入并运行。这就是有趣的地方:因为正在导入 run.py__name__ == '__main__'False(更多信息请参阅here ),因此永远不会调用 app.run(debug = True, port = 5000)

这就是您想要的(至少在公开可用的设置中),因为在调用 app.run() 时使用的内置于 Flask 中的网络服务器具有一些相当严重的安全漏洞。 --log-level=DEBUG 也可能有点欺骗性,因为它使用了“DEBUG”这个词,但它只是告诉 gunicorn 哪些日志语句要打印,哪些要忽略(查看 Python docs on logging 。)

解决方案是在本地运行应用程序并在其上工作/调试时运行python run.py,并且仅在您想要模拟生产时运行foreman start环境。此外,由于 gunicorn 只需要导入 app 对象,您可以消除一些歧义并将您的 Procfile 更改为

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

您还可以查看 Flask Script它有一个内置命令 python manage.py runserver,可以在 Debug模式下运行内置的 Flask 网络服务器。

关于python - 源代码更改时自动重新加载 Flask 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23400599/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com