首页 > 解决方案 > ModuleNotFoundError:部署到 Elastic Beanstalk 时没有名为“django”的模块

问题描述

我一直在本地开发一个 Django 项目,最终决定将其发布到 AWS Elastic Beanstalk,在部署过程中,我不断收到一条错误消息:

从 django.core.wsgi 导入 get_wsgi_application

没有名为“django”的模块

我已经浏览了来自 AWS 的官方教程以及来自 Real Python的教程我已经验证了 Django 实际上是通过运行安装的pip freeze并且它返回

...

颜色==0.3.9

Django==2.2.9

django-celery==3.3.1

……

此外,我一直在本地广泛使用 Django。但只是为了确保我运行了以下命令并得到了这个输出。

(.venv) $ 源 .venv/bin/activate

(.venv) $ pip install django

已满足要求:.​​/.venv/lib/python3.7/site-packages (2.2.9) 中的 django

已满足要求:.​​/.venv/lib/python3.7/site-packages 中的 sqlparse(来自 django)(0.3.0)

已满足要求:.​​/.venv/lib/python3.7/site-packages 中的 pytz(来自 django)(2019.3)

当我运行时:

(.venv) $ python
Python 3.7.4 (default, Jul  9 2019, 18:13:23) 
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print(django.__file__)
.../code/core_web_app/.venv/lib/python3.7/site-packages/django/__init__.py

对不起,如果这已经结束了,但我看过的大多数帖子都有评论询问是否安装了 Django 或说必须安装 Django。我的假设是 Django 安装在我的本地机器上,但没有安装在我的远程机器上。此外,我已经注意到这篇文章并确保我的 requirements.txt 文件也在我的根目录中。您可以在下面找到一些附加信息。

.ebextensions/django.config

    option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "myapp.settings"
    "PYTHONPATH": "/opt/python/current/app/src:$PYTHONPATH"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: src/myapp/wsgi.py
    NumProcesses: 3
    NumThreads: 20
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "www/static/"

src/myapp/wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')

application = get_wsgi_application()

任何帮助将不胜感激,因为这是我第一次使用这个,我想我在某个地方犯了一个非常愚蠢的错误。

标签: pythondjangopython-3.xamazon-web-servicesamazon-elastic-beanstalk

解决方案


为了回答您的问题,在使用 AWS ElasticBeanstalk(EBS) 部署 Django、flask 或 dash 应用程序时,您需要检查的事项很少。

注意:如果应用程序使用 AWS EBSCLI(即 EBS 的命令行功能,而不是通过您的 AWS 账户上的 EBS 的用户界面进行托管的方法)托管,则概述了以下步骤。根据我的个人经验,我发现托管应用程序的 UI 方法不适用于烧瓶、Django 或 dash 应用程序。

  1. 在将您的应用程序托管到 EBS 时,如果您有任何错误,请检查托管日志。即使 EBS 提示您已成功托管应用程序,您也必须交叉检查日志以查找任何错误。
  2. 确认步骤 1 中没有错误后,导航到 EBS 应用程序的日志控制台,下载整个日志,然后检查是否有任何其他错误。如果你有任何错误,你必须先纠正它们。
  3. 既然您已经说过 AWS Linux 机器无法导入 Django 包,可能是您在不同的虚拟环境下手动检查 Django 包,而 AWS EBS 已在另一个虚拟环境下托管您的应用程序。
  4. 为了解决第 3 步,碰巧在 linux 服务器上使用 AWS EBS 托管的任何应用程序都托管在以下虚拟环境路径下。 /opt/python/run/venv/bin. 为了验证这一点,只需cd /opt/python/run/venv/bin在连接到您的 linux 服务器后键入命令。一旦您能够导航到此路径,请尝试通过以下方式激活 virtualenvsource ./activate
  5. 一旦您激活了 AWS EBS 为您的应用程序创建的这个 virtualenv,请尝试python在这个 virtualenv 中开始,然后尝试import django. 如果你发现这个 virtualenv 下没有安装 django 包,你必须手动安装它,因为这是你的托管应用程序将引用的 virtualenv。并且您的托管应用程序需要引用的任何新包都必须仅安装在此 virtualenv 下。
  6. 为了进一步为您提供更多信息,您的托管应用程序将驻留在此目录下的 AWS linux 服务器上/opt/python/bundle/2/app。如果您将来愿意更改应用程序代码或任何支持文件,可以参考此目录。例如,如果您想更改任何源代码,您可以直接编辑此存储库下的源代码文件并重新启动服务器以使更改生效。

更新: 由于您指定在托管应用程序期间,您收到了 django package not found 的错误,请按照以下步骤纠正此错误。

  1. 创建requirements.txt文件时,请确保该文件中仅存在应用程序所需的包。当您这样做时pip freeze requirements.txt,当前环境中存在的所有包都将在requirements.txt文件中创建一个条目。这可能会在 AWS EBS 尝试安装此文件时产生错误。原因是,例如,PackageA 和 PackageB 可能是 PackageC 的依赖包。如果您安装 PackageC,则会自动安装 PackageA 和 PackageB。话虽如此,您必须删除requirements.txt文件中的 PackageA 和 PackageB 并仅保留 PackageC。因为 PackageC 的安装会自动安装它的依赖包,即 PackageA 和 PackageB。因此,为了简短起见,您只需要包含您手动安装的软件包pip installrequirements.txt文件中的本地计算机中。所有其他包将是这些包的依赖包,并在安装主包时自动安装。所以这些依赖包需要从requirements.txt.
  2. 如果您仍然收到相同的错误,一旦应用程序出现错误,请尝试使用 CLI(命令行界面)连接到您的 AWS Linux 机器,通过执行导航到虚拟环境路径cd /opt/python/run/venv/bin,使用激活它source ./activate,调用python解释器和然后尝试手动导入包。如果您发现任何软件包被卸载,您可以手动安装它们并重新启动服务器以使更改生效。

有关更多详细信息,您可以参考此链接。虽然这是为托管烧瓶应用程序而创建的,但托管 django 应用程序也可以在相同的线路上工作。


推荐阅读