簡體   English   中英

ModuleNotFoundError:部署到 Elastic Beanstalk 時沒有名為“django”的模塊

[英]ModuleNotFoundError: No module named 'django' when deploying to Elastic Beanstalk

我一直在本地處理 Django 項目,最終決定將其發布到 AWS Elastic Beanstalk,在部署過程中,我不斷收到錯誤消息:

從 django.core.wsgi 導入 get_wsgi_application

沒有名為“django”的模塊

我已經瀏覽了來自 AWS的官方教程以及來自 Real Python教程我已經通過運行pip freeze驗證了 Django 實際上已安裝並返回

...

顏色==0.3.9

Django==2.2.9

django-芹菜==3.3.1

....

此外,我一直在本地廣泛使用 Django。 但為了確保我運行了以下命令並得到了這個輸出。

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

(.venv) $ pip install django

已經滿足要求:django in ./.venv/lib/python3.7/site-packages (2.2.9)

已滿足要求:.​​/.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()

任何幫助將不勝感激,因為這是我第一次使用它,我認為我在某個地方犯了一個非常愚蠢的錯誤。

好吧,回答您的問題,在使用 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激活 virtualenv
  5. 一旦您激活了 AWS EBS 為您的應用程序創建的這個 virtualenv,嘗試在這個 virtualenv 中啟動python ,然后嘗試import django 如果你發現 django 包沒有安裝在這個 virtualenv 下,你必須手動安裝它,因為這是你的托管應用程序將引用的 virtualenv。 並且您的托管應用程序需要引用的任何新包都必須僅安裝在此 virtualenv 下。
  6. 為了進一步向您提供更多信息,您的托管應用程序將駐留在此目錄/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導航到虛擬環境路徑cd /opt/python/run/venv/bin ,使用source ./activate激活它,調用python解釋器,然后嘗試手動導入包。 如果您發現任何軟件包被卸載,您可以手動安裝它們並重新啟動服務器以使更改生效。

有關更多詳細信息,您可以參考此鏈接 盡管這是為托管 Flask 應用程序而創建的,但托管 django 應用程序也可以在同一行上工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM