【问题标题】:Auto reloading python Flask app upon code changes在代码更改时自动重新加载 python Flask 应用程序
【发布时间】:2013-04-27 00:31:03
【问题描述】:

我正在研究如何使用 Python 开发一个体面的网络应用程序。因为我不想让一些高阶结构妨碍我,所以我选择了轻量级的Flask framework。时间会证明这是否是正确的选择。

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

【问题讨论】:

    标签: python apache flask


    【解决方案1】:

    如果您在谈论测试/开发环境,那么只需使用调试选项。发生代码更改时,它将自动重新加载烧瓶应用程序。

    app.run(debug=True)
    

    或者,从外壳:

    $ export FLASK_DEBUG=1
    $ flask run
    

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

    【讨论】:

    • 这仅在您通过内置开发服务器运行站点时有效。但在 Apache 上通过 wsgi 运行它时不会。而且我并不坚持我真的需要在 Apache 上运行它,所以也许你建议的方法是正确的。
    • 正确。在开发环境中,内置服务器运行良好,您无需重新发明轮子即可重新加载应用程序。我强烈建议您只使用内置服务器进行开发。目的。无论如何,你不想在每次代码更改时自动重新加载应用程序。
    【解决方案2】:

    在测试/开发环境中

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

    app.run(debug=True)
    

    app.debug = True
    

    如果需要,您还可以使用单独的配置文件来管理所有设置。例如,我使用带有“DEBUG = True”选项的“settings.py”。导入这个文件也很容易;

    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'
    

    我希望这会有所帮助!

    【讨论】:

    • 感谢您的精彩提示。我简化了一点。创建一个 bash 脚本,该脚本在执行时会触及自身。因此,您只需要在需要重新加载时启动它。我的解决方案:# touch_me_and_reload.sh touch $0
    • @Ewan。 touch-reload 线应该在哪里? [program:uwsig] 部分还是 [supervisord] 部分?
    • @user805981- 两者都不是,单独的 uwsgi 配置 .ini 文件。如果您阅读有关“touch-reload”的文档,则它位于 uWSGI,而不是主管配置中。
    • 谢谢。 app.run(debug=True) 失败,但设置环境变量有效。
    【解决方案3】:

    如果您使用 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/__init__.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】:

      目前推荐的方法是使用flask 命令行实用程序。

      https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

      例子:

      $ export FLASK_APP=main.py
      $ export FLASK_ENV=development
      $ flask run
      

      或在一个命令中:

      $ FLASK_APP=main.py FLASK_ENV=development flask run
      

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

      例子:

      $ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080
      

      更多选项可用:

      $ flask run --help
      

      FLASK_APP 也可以设置为module:appmodule:create_app 而不是module.py。有关完整说明,请参阅https://flask.palletsprojects.com/en/1.1.x/cli/#application-discovery

      【讨论】:

      • 或python3.5中的pyvenv,flask run也可以,因为当你pip install flask时,一个flask可执行文件也会安装在venv/bin/文件夹中。
      • 这是一个简单的解决方案,可以翻译成 Docker 用于开发目的。可以看到同样的解决方案here
      • 正常工作,但这似乎不适用于 Ubuntu 上的 NTFS 分区上的代码。代码没有问题,但烧瓶似乎无法识别该设置中的更改。
      • flask 怎么知道你想看哪些文件?
      • 如果我使用“sudo pipenv run python3 main.py”来执行我的网络应用程序,那么我应该为相同的热重载功能输入什么?
      【解决方案5】:

      要在 PyCharm 中实现这一点,请将“环境变量”部分设置为:

      PYTHONUNBUFFERED=1;
      FLASK_DEBUG=1
      

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

      【讨论】:

      【解决方案6】:

      Flask 1.0 及更高版本的一些更新

      热重载的基本方法是:

      $ export FLASK_APP=my_application
      $ export FLASK_ENV=development
      $ flask run
      
      • 你应该使用FLASK_ENV=development(不是FLASK_DEBUG=1
      • 作为安全检查,您可以运行 flask run --debugger 以确保它已打开
      • 如果您有.env file in the project roothave python-dotenv installed,Flask CLI 现在将自动读取FLASK_APPFLASK_ENV 之类的内容

      【讨论】:

      • export FLASK_ENV=development 为我工作。 app.run(debug=True) 似乎不起作用。
      • @alex 奇怪的行为
      【解决方案7】:

      我有不同的想法:

      第一:

      pip install python-dotenv
      

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

      第二:

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

      FLASK_ENV=development
      

      完成了!

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

      当您编辑文件时,只需保存更改即可。你会看到自动重新加载是为你准备的:

      更多解释:

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

      【讨论】:

      • 完美!另外,不要忘记将FLASK_APP 变量包含到.flaskenv 文件中。
      • 这是更整洁、更有用的答案...谢谢
      • 这行得通。谢谢。
      【解决方案8】:

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

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

      (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
      

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

      【讨论】:

        【解决方案9】:

        从终端你可以简单地说

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

        或在你的文件中

        if __name__ == "__main__":
            app.run(debug=True)
        
        【解决方案10】:
        app.run(use_reloader=True)
        

        我们可以使用这个,use_reloader,所以每次我们重新加载页面时,我们的代码更改都会更新。

        【解决方案11】:

        使用这个方法:

        app.run(debug=True)
        

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

        示例代码:

        from flask import Flask
        
        app = Flask(__name__)
        
        @app.route("/")
        def index():
           return "Hello World"
        
        
        if __name__ == '__main__':
          app.run(debug=True)
        

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

        【讨论】:

          【解决方案12】:

          为了帮助在浏览器中快速自动更改:

          pip install livereload

          from livereload import Server
          
          if __name__ == '__main__':
              server = Server(app.wsgi_app)
              server.serve()
          

          接下来,再次启动您的服务器:

          例如。您的 .py 文件是 app.py

          python app.py

          【讨论】:

            猜你喜欢
            • 2014-06-17
            • 1970-01-01
            • 1970-01-01
            • 2012-03-19
            • 2013-04-05
            • 2018-12-13
            • 2015-08-19
            相关资源
            最近更新 更多