代码更新未反映在Django应用程序行为中。为什么会发生这种情况?如何解决这个问题?

2024-04-23 16:39:27 发布

您现在位置:Python中文网/ 问答频道 /正文

问题摘要

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

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

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

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

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

  • Django版本:1.7

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

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

应用程序的目录结构

我用appname

根文件夹

appname
py2_appname
staticfiles

py2_应用程序名

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

^{pr2}$

appname文件夹

包含应用程序代码

├── 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. 另一个建议是通过执行命令touch来修改应用程序wsgi file last modified meta字段。这会将上次修改的时间更新为当前时间,但不会更改文件的内容。这不起作用,但可能我没有更新正确的文件。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()

在设置.py文件,也在appname文件夹中,只有一行代码提到了wsgi:

    WSGI_APPLICATION = 'appname.wsgi.application'

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

  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高一级的文件夹,包含应用程序中使用的二进制文件。在


Tags: 文件代码py服务器文件夹应用程序wsgibin
1条回答
网友
1楼 · 发布于 2024-04-23 16:39:27

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

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

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

相关问题 更多 >