【问题标题】:Django urls.py not updated unless Apache reload除非 Apache 重新加载,否则 Django urls.py 不会更新
【发布时间】:2019-07-10 11:43:00
【问题描述】:

除非我重新加载 Apache,否则我的 Django 项目中对 urls.py 文件的更改似乎会被忽略。任何想法为什么会发生这种情况?这是我的虚拟主机文件:

<IfModule mod_ssl.c>
  <VirtualHost www.mydomain.com:443>
    ServerName www.mydomain.com
    ServerAdmin myaddress@mydomain.com

    WSGIScriptAlias / /var/www/html/www.mydomain.com/myproject/wsgi.py
    WSGIDaemonProcess myproject python-path=/var/www/html/www.mydomain.com:/var/www/html/www.mydomain.com/env/lib/python3.6/site-packages
    WSGIProcessGroup myproject

    <Directory /var/www/html/myproject>
       <Files wsgi.py>
          Order deny,allow
          Allow from all
       </Files>
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # Let's Encrypt files
    SSLCertificateFile /etc/letsencrypt/live/www.mydomain.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.mydomain.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
  </VirtualHost>
</IfModule>

更改会立即应用,因为我可以通过django-extensionsshow_urls 命令进行检查。

【问题讨论】:

    标签: django apache mod-wsgi wsgi django-wsgi


    【解决方案1】:

    因为python文件被缓存为字节码,uwsgi正在使用它们。

    您是否注意到,每当您运行 python 文件时,都会自动生成 __pycache__*.pyc 文件,这些文件是 python 字节码文件。

    您需要在 uwsgi 配置文件中设置触摸重载功能来替换那些缓存文件并生成新的文件,以便对您的最新编辑进行更改。

    在你的 uwsgi 配置文件中设置如下:

    [uwsgi]
    
    touch-reload = /path/to/your/django/project/reload.ini
    

    如果你没有自动重新加载 uwsgi 配置文件更改功能,你需要重新加载应用程序或重新启动 uwsgi 以使新配置生效。

    每当您对代码进行更改时,都可以使用 touch 命令重新加载。

    $ touch /path/to/your/django/project/reload.ini
    

    无需重新加载或重启 Apache。

    文档:The Art of Graceful Reloading

    如果你使用 git 推送代码,你可以使用 post-receive 钩子来自动完成。

    这里有类似的主题How to configure Git post commit hook

    【讨论】:

    • 我唯一安装的是 Apache 的 mod-wsgi,通过 Ubuntu 的 libapache2-mod-wsgi-py3 包。我不确定我是否安装了uwsgi 或如何更改它的配置文件。至少我从不主动调用 uwsgi。我怎么能检查呢?它是作为 Django 的一部分安装的吗?
    • 您使用哪个服务器? Django 只是一个 python web 框架,。 uwsgi 是运行 python 程序的服务器。 django 正在使用 uwsgi。
    • 我只安装了 Apache、相应的 mod wsgi 和 python+Django。所以你建议安装uwsgi作为其中的一部分?运行 locate uwsgi 没有产生任何结果。这是 Ubuntu 18.04、Django 2.1.7、Python 3.6、Apache 2.4.29。
    • 我在我的virtualenv 所在的目录中也没有找到任何运行find . -name "*uwsgi*" -print 的东西。
    • 如上所示在你的 apache 配置文件上使用 touch-reload。
    猜你喜欢
    • 2017-02-16
    • 2021-05-14
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多