Python Django应用程序行为中未反映代码更新。为什么会发生这种情况?可以采取哪些措施来解决此问题?

Python Django应用程序行为中未反映代码更新。为什么会发生这种情况?可以采取哪些措施来解决此问题?,python,django,nginx,Python,Django,Nginx,问题摘要 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "appname.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application() 我正在尝试获取Django应用程序代码,以便在其运行的服务器上进行更新。我已经上传了更新的代码(一个.py文件),但是更新的

问题摘要

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

    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
我正在尝试获取Django应用程序代码,以便在其运行的服务器上进行更新。我已经上传了更新的代码(一个
.py
文件),但是更新的代码没有显示在应用程序的行为中。我已经尝试了好几次来解决这个问题。我将在下面回顾这些尝试,希望这将有助于诊断我需要做什么

以下是有关该应用程序的一些附加详细信息,有助于为问题提供上下文。

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

  • 说到Django,我还是有点生疏

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

  • Django版本:1.7

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

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

应用程序的目录结构

    /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
我正在用appname替换应用程序名称

根文件夹

appname
py2_appname
staticfiles
py2_appname

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

bin
include
lib
local
appname文件夹

appname
py2_appname
staticfiles
这包含应用程序代码

├── 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
我已经做了一些尝试来解决这个问题。

  • 删除原始编译文件。这将强制在执行生成电子邮件的脚本时生成新的脚本。这并没有发生。未创建新的.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
    
  • 另一个建议是通过执行命令:touch来修改应用程序wsgi file last-modified元字段。这会将上次修改的时间更新为当前时间,但保持文件内容不变。这不起作用,但可能我没有更新正确的文件。Im更新的文件名为: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'
    
    这是应用触摸的正确文件,以便我的服务器应用代码更改吗

  • 重新启动服务器。这是一个尚未尝试的问题。如上所述,这是一个生产服务器。如果应用程序出现故障,我不确定是否可以正确启动。也许有人可以就此提出建议。以下是有关服务器和应用程序的更多信息:
  • 服务器上运行的进程(从ps-aux命令列)


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

    让脚本
    admin\u email.py
    重新编译的诀窍是重新启动
    gunicorn
    。这可以通过
    killall
    命令完成。要重新启动gunicorn,请执行:

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

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

    通过重新启动服务器…您重新启动了gunicorn吗?我使用uwsgi,更新代码后需要重新启动服务器。是的,如果您对如何重新启动
    gunicorn
    有任何建议,我将不胜感激。我希望这将更新应用程序的工作方式。请注意上面显示的
    gunicorn
    过程。如果需要重新启动,我希望能够运行相同的进程。由于这是一台prod服务器,我想100%确定我能够正确重启。另外,检查supervisor您应该能够从那里重新启动进程,这样,命令可能正是从
    ps:/path/to/appenv/py2_appname/bin/python/opt/www/py2_appname/bin/gunicorn appname.wsgi--bind=127.0.0.1:8001--workers=3中显示的命令