ModuleNotFoundError:部署到Elastic Beanstalk时,没有名为“ django”的模块

时间:2020-01-23 05:14:08

标签: python django python-3.x amazon-web-services amazon-elastic-beanstalk

我一直在本地处理Django项目,最后我决定将其发布到AWS Elastic Beanstalk,并且在部署过程中,我不断收到错误消息:

从django.core.wsgi导入get_wsgi_application

没有名为“ django”的模块

我已经遍历了官方tutorial from AWStutorial from the Real Python,并且已经通过运行pip freeze验证了Django实际上已经安装并且返回了

...

colorama == 0.3.9

Django == 2.2.9

django-celery == 3.3.1

....

我也一直在本地与Django广泛合作。但是只是为了确保我运行了以下命令并获得了此输出。

(。venv)$ source .venv / bin / activate

(。venv)$ pip安装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是安装在我的本地计算机上,而不是安装在我的远程计算机上。此外,我注意到了这个post,并确保我的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()

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

1 个答案:

答案 0 :(得分:0)

很好地回答您的问题,在使用AWS ElasticBeanstalk(EBS)部署Django或flask或dash应用程序时,您需要检查的东西很少。

注意::如果应用程序是使用AWS EBSCLI托管的,则概述了以下步骤,即EBS的命令行功能,而不是通过AWS帐户上EBS的用户界面托管的方法。 以我的亲身经历,我发现托管应用程序的UI方法不适用于flask,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。为了验证这一点,只需在连接到Linux服务器后键入命令cd /opt/python/run/venv/bin。一旦能够导航到该路径,请尝试通过提供source ./activate
  5. 来激活virtualenv
  6. 一旦激活了AWS EBS为您的应用程序创建的虚拟环境,请尝试在该虚拟环境中启动python,然后尝试import django。如果发现在此virtualenv下未安装django软件包,则必须手动安装它,因为这是托管应用程序将引用的virtualenv。托管应用程序需要引用的所有新软件包都必须仅安装在此virtualenv下。
  7. 为进一步提供更多信息,您的托管应用程序将位于此目录/opt/python/bundle/2/app下的AWS linux服务器上。如果以后愿意更改应用程序代码或任何支持文件,则可以参考此目录。例如,如果要更改任何源代码,则可以直接在此存储库下编辑源代码文件,然后重新启动服务器以使更改生效。

更新: 由于您已指定在托管应用程序期间,在django软件包上收到了未找到的错误,请按照以下步骤更正此错误。

  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 install手动安装的软件包包括在requirements.txt文件中的本地计算机中。所有其他软件包都是这些软件包的从属软件包,并在安装主软件包时自动安装。因此,需要从requirements.txt中删除这些从属程序包。
  2. 如果仍然收到相同的错误,则在将应用程序托管有错误后,请尝试使用CLI(命令行界面)连接到您的AWS Linux计算机,通过执行cd /opt/python/run/venv/bin导航到虚拟环境路径,使用source ./activate激活它,调用python解释器,然后尝试手动导入软件包。如果发现任何软件包已卸载,则可以手动安装它们,然后重新启动服务器以使更改生效。

有关更多详细信息,您可以参考此link。尽管这是为托管Flask应用程序而创建的,但托管django应用程序也可以在同一行上工作。