【问题标题】:Code update not reflected in Django apps behavior. Why is this happening and what can be done to fix this issue?代码更新未反映在 Django 应用程序行为中。为什么会发生这种情况以及可以做些什么来解决这个问题?
【发布时间】:2015-07-14 23:22:59
【问题描述】:

问题总结

我正在尝试在运行它的服务器上更新 Django 应用程序代码。我已经上传了更新的代码(.py 文件),但更新的代码没有显示在应用程序的行为中。我已经尝试了几次尝试来解决这个问题。我将在下面介绍这些尝试,希望这将有助于诊断我需要做什么。

以下是有关应用程序的一些其他详细信息,可帮助您了解问题的背景。

  • 我不是编写应用程序的开发人员,我受雇负责维护和更新。遗憾的是,没有给出任何文档,也很少有代码注释。

  • 说到 Django,我还是有点青涩。

  • 此问题发生在生产服务器上,因此必须注意尽量减少停机时间。由于上述两个原因,我不完全相信如果服务器出现故障我可以重新启动服务器。

  • Django 版本:1.7

  • 正在使用的服务器:gunicorn + nginx

应用程序的工作方式很简单。用户下订单,这会触发要发送的电子邮件。我改的代码也很简单。一个额外的 html 段落被添加到包含电子邮件内容的字符串中。测试应用程序时,不会添加此新字符串。代码没有更新。

应用程序的目录结构

我将应用程序名称替换为 appname

根文件夹

appname
py2_appname
staticfiles

py2_appname

这包含包含的包和二进制文件

bin
include
lib
local

应用名称文件夹

这包含应用程序代码

├── accounts
│   └── migrations
├── admin_keys
├── emails
├── errors
│   └── migrations
├── main_site
│   └── migrations
├── appname
│   └── __pycache__
├── appname_admin
│   └── migrations
├── promotions
│   └── migrations
├── signaling
│   ├── migrations
│   └── templates
│       └── signal_email
├── static
│   ├── css
│   ├── fonts
│   ├── images
│   │   ├── email
│   │   ├── main
│   │   └── thumbnails
│   └── js
│       └── locales
├── templates
│   ├── accounts
│   ├── errors
│   ├── _layouts
│   ├── mainsite
│   ├── appname_admin
│   └── test
└── testing
    └── migrations

我已经做了一些尝试来解决这个问题。

  1. 删除原来的编译文件。当执行生成电子邮件的脚本时,这将强制生成一个新的。这没有发生。未创建新的 .pyc 文件。该应用程序仍然像往常一样运行。这似乎暗示它缓存在某处的执行代码。

    Here are the original files:
    -rw-r--r-- 1 ubuntu ubuntu 47872 Jul 13 04:39 admin_email.py 
    -rw-r--r-- 1 root   root   48212 Feb 10 03:12 admin_email.pyc
    
  2. 另一个建议是通过执行以下命令来修改应用程序 wsgi 文件的最后修改元字段: touch 。这会将上次修改时间更新为当前时间,但文件内容保持不变。这不起作用,但也许我没有更新正确的文件。我正在更新的文件名为:wsgi.py。它位于 appname 文件夹中(见上文)

这里是wsgi.py的内容

    import os
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "appname.settings")

    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()

在同样位于appname文件夹的settings.py文件中,只有一行代码提到了wsgi:

    WSGI_APPLICATION = 'appname.wsgi.application'

这是应用触摸以便我的服务器应用代码更改的正确文件吗?

  1. 重新启动服务器。这还没有尝试过。如上所述,这是一个生产服务器。如果应用程序出现故障,我不确定是否可以正确启动应用程序。也许有人可以就此提供建议。以下是有关服务器和应用程序的更多信息:

服务器上运行的进程(来自 ps -aux,命令列)

    /path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3
    /path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3
    /path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3
    /path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3
    nginx: master process /usr/sbin/nginx
    nginx: worker process
    nginx: worker process
    nginx: worker process
    nginx: worker process

请注意 gunicorn 是从 py2_appname 运行的。这是一个比 appname 高一级的文件夹,其中包含应用程序中使用的二进制文件。

【问题讨论】:

  • 通过重新启动服务器...您是否重新启动了 gunicorn?我在 uwsgi 上工作,更新代码后,我需要重新启动服务器。
  • 是的,如果有任何关于如何重新启动 gunicorn 的建议,我将不胜感激。我希望这将更新应用程序的工作方式。请注意上面显示的gunicorn 进程。如果我需要重新启动,我希望能够运行相同的进程。由于这是一个 prod 服务器,我希望 100% 确定我能够正确重启。
  • 另外,检查主管supervisord.org/configuration.html 你应该可以从那里重新启动进程
  • 好吧,也许这个命令正是ps: /path/to/appenv/py2_appname/bin/python /opt/www/py2_appname/bin/gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3显示的内容

标签: python django nginx


【解决方案1】:

让脚本admin_email.py 重新编译的技巧是重新启动gunicorn。这可以通过killall 命令完成。重启gunicorn 执行:

gunicorn appname.wsgi --bind=127.0.0.1:8001 --workers=3 --daemon

这必须从执行 django 脚本manage.py 的目录中执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2013-08-02
    • 2018-12-19
    • 2021-04-30
    • 2010-09-22
    相关资源
    最近更新 更多