代码更改时自动重新加载python Flask app

时间:2013-05-02 18:04:11

标签: python apache web flask

我正在研究如何使用Python开发一个体面的Web应用程序。由于我不希望某些高阶结构妨碍我,我的选择落在轻量级Flask framework上。时间将证明这是否是正确的选择。

所以,现在我已经设置了一个带有mod_wsgi的Apache服务器,我的测试站点运行正常。但是,我想通过在我制作的py或模板文件中的任何更改时自动重新加载网站来加速开发例程。我看到网站的.wsgi文件中的任何更改都会导致重新加载(即使没有在apache配置文件中使用WSGIScriptReloading),但我仍然需要手动生成它(即插入额外的换行符,保存)。当我编辑一些应用程序的py文件时,有什么方法可以导致重新加载吗?或者,我应该使用IDE为我刷新.wsgi文件?

12 个答案:

答案 0 :(得分:159)

如果您正在讨论测试/开发环境,那么只需使用调试选项即可。当代码发生变化时,它会自动重新加载烧瓶应用程序。

app.run(debug=True)

或者,来自shell:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode

答案 1 :(得分:115)

当前推荐的方式(Flask> = 0.11)与flask命令行实用程序一起使用。

http://flask.pocoo.org/docs/0.11/server/

示例:

$ export FLASK_APP=main.py
$ export FLASK_DEBUG=1
$ python -m flask run

或在一个命令中:

$ FLASK_APP=main.py FLASK_DEBUG=1 python -m flask run

我更喜欢python -m flask run而不是flask run,因为前者也适用于virtualenv

如果您想要与默认端口(5000)不同的端口添加--port选项。

示例:

$ python -m flask run --port 8080

有更多选项可供选择:

$ python -m flask run --help

答案 2 :(得分:37)

在测试/开发环境中

werkzeug调试器已经具有“自动重新加载”功能,可通过执行以下操作之一启用:

app.run(debug=True)

app.debug = True

如果需要,您还可以使用单独的配置文件来管理所有设置。例如,我使用'settings.py'和'DEBUG = True'选项。导入此文件也很简单;

app.config.from_object('application.settings')

但是,这不适合生产环境。

生产环境

我个人选择Nginx + uWSGI而不是Apache + mod_wsgi,但出于一些性能原因以及配置选项。 touch-reload选项允许您指定一个文件/文件夹,该文件/文件夹将导致uWSGI应用程序重新加载新部署的烧瓶应用程序。

例如,您的更新脚本会将最新的更改下拉并触及“reload_me.txt”文件。您的uWSGI ini脚本(由Supervisord保留 - 显然)在某处有这一行:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

我希望这有帮助!

答案 3 :(得分:20)

如果您正在使用uwsgi运行,请查看python自动重新加载选项:

uwsgi --py-autoreload 1

示例uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root / __初始化__。PY

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

然后运行:

uwsgi --ini uwsgi-dev-example.ini

注意:此示例还启用了调试器。

我采用这条路线模仿生产,尽可能接近我的nginx设置。只需在nginx后面使用内置的Web服务器运行烧瓶应用程序,就会导致网关错误。

答案 4 :(得分:5)

Flask 1.0的一些更新

热重新加载的基本方法是:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • 您应该使用FLASK_ENV=development(而不是FLASK_DEBUG=1
  • 作为安全检查,您可以运行flask run --debugger只是为了确保它已打开
  • 这是working link to the docs(接受的答案的链接已断开)

答案 5 :(得分:3)

可以在调试模式下执行Flask应用程序。在这种模式下,默认情况下启用了开发服务器的两个非常方便的模块,称为 reloader debugger 。 启用重新加载器后,Flask会监视项目的所有源代码文件,并在修改任何文件后自动重新启动服务器。

默认情况下,调试模式是禁用的。要启用它,请在调用烧瓶FLASK_DEBUG=1之前设置一个run环境变量:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

在开发过程中启用启用 reloader 的服务器非常有用,因为每次修改和保存源文件时,服务器都会自动重新启动并获取更改。

答案 6 :(得分:2)

app.run(use_reloader=True)

我们可以使用use_reloader,因此每次重新加载页面时,我们的代码更改都将更新。

答案 7 :(得分:1)

我有一个不同的主意:

第一:

pip install python-dotenv

安装python-dotenv模块,该模块将读取您的项目环境的本地首选项。

第二:

在您的项目目录中添加.flaskenv文件。添加以下代码:

FLASK_ENV=development

完成了!

有了Flask项目的此配置,当您运行flask run时,您将在终端中看到以下输出:

enter image description here

当您编辑文件时,只需保存更改即可。您会看到自动重新加载在那里:

enter image description here

更多说明:

当然,您可以在需要时手动点击export FLASK_ENV=development。但是使用不同的配置文件来处理实际的工作环境似乎是一个更好的解决方案,因此我强烈建议我使用此方法。

答案 8 :(得分:1)

您可以在终端上简单地说

expoort FLASK_APP=app_name.py
export FLASK_ENV=development
flask run

或在您的文件中

if __name__ == "__main__":
    app.run(debug=True)

答案 9 :(得分:1)

使用这个方法:

app.run(debug=True)

当发生代码更改时,它会自动重新加载 Flask 应用程序。

示例代码:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
   return "Hello World"


if __name__ == '__main__':
  app.run(debug=True)

好吧,如果您想节省时间而不是每次发生更改时都重新加载网页,那么您可以尝试使用键盘快捷键 Ctrl + R 来快速重新加载页面。

答案 10 :(得分:0)

要在PyCharm中实现此目的,请将“环境变量”部分设置为:

PYTHONUNBUFFERED = 1; FLASK_DEBUG = 1

对于Flask'运行/调试配置'

答案 11 :(得分:0)

最好的选择是use_reloader

import tkinter as tk

from tkinter import *
import tkinter.filedialog as fdialog

class karl(Frame):
  def __init__(self):
    tk.Frame.__init__(self)
    self.pack(fill = tk.BOTH)
    self.master.title("Image Selector")
    self.master.geometry("500x500")
    self.master.resizable(0, 0)
    self.pack_propagate(0)

    self.label_button_1 = Label(self, text="Select directory for picking images")
    self.label_button_1.grid(row = 0, column = 0, columnspan = 1, sticky = W)

    self.button_1 = tk.Button(self, text="CLICK HERE", width=25, command=self.open_dialog_box_to_select_folder)
    self.button_1.grid(row=0, column=1, columnspan=2, sticky=W)

    self.label_for_label_directory = Label(self, text="Current chosen directory")
    self.label_for_label_directory.grid(row=1, column=0, rowspan=1, columnspan=1, sticky=W)

    self.label_directory = Label(self, text="")
    self.label_directory.grid(row=1, column=1, rowspan=1, columnspan=2, sticky=W)

    self.label_for_entry_for_class_label_values = Label(self, text="Enter (+) seperated class labels\nto be assigned to the images")
    self.label_for_entry_for_class_label_values.grid(row = 2, column = 0, rowspan = 1, columnspan = 2, sticky = W)

    self.entry_for_class_label_values = Entry(self)
    self.entry_for_class_label_values.grid(row = 2, column = 1, rowspan = 1, columnspan = 1, sticky = W)


  def open_dialog_box_to_select_folder(self):

    self.chosen_directory_name = fdialog.askdirectory()
    self.label_directory.config(text = self.chosen_directory_name)



def main():
   karl().mainloop()

if __name__ == '__main__':
    main()