簡體   English   中英

django + virtualenv + gunicorn - 沒有名為 django.core.wsgi 的模塊?

[英]django + virtualenv + gunicorn - No module named django.core.wsgi?

我在我的虛擬gunicorn安裝了gunicorn

$ pip install gunicorn
Collecting gunicorn
  Using cached gunicorn-19.7.1-py2.py3-none-any.whl
Installing collected packages: gunicorn
Successfully installed gunicorn-19.7.1

但是當我嘗試用它運行我的應用程序時:

$ gunicorn helloapp.wsgi
[2017-05-18 22:42:36 +0000] [1963] [INFO] Starting gunicorn 19.6.0
[2017-05-18 22:42:36 +0000] [1963] [INFO] Listening at: http://127.0.0.1:8000 (1963)
[2017-05-18 22:42:36 +0000] [1963] [INFO] Using worker: sync
[2017-05-18 22:42:36 +0000] [1967] [INFO] Booting worker with pid: 1967
[2017-05-18 22:42:36 +0000] [1967] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 557, in spawn_worker
    worker.init_process()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 126, in init_process
    self.load_wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 136, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/lib/python2.7/dist-packages/gunicorn/util.py", line 384, in import_app
    __import__(module)
  File "/var/www/html/django-project/helloapp/helloapp/wsgi.py", line 12, in <module>
    from django.core.wsgi import get_wsgi_application
ImportError: No module named django.core.wsgi
[2017-05-18 22:42:36 +0000] [1967] [INFO] Worker exiting (pid: 1967)
[2017-05-18 22:42:36 +0000] [1963] [INFO] Shutting down: Master
[2017-05-18 22:42:36 +0000] [1963] [INFO] Reason: Worker failed to boot.

我做錯了什么?

這是我的應用程序結構: 在此處輸入圖片說明

有任何想法嗎?

這是我的要求.txt:

appdirs==1.4.3
Django==1.11.1
gunicorn==19.7.1
packaging==16.8
pyparsing==2.2.0
pytz==2017.2
six==1.10.0

編輯:

(env) xxx@xxx-desktop:/var/www/html/django-project/helloapp$ which gunicorn
/var/www/html/django-project/helloapp/env/bin/gunicorn

(env) xxx@xxx-desktop:/var/www/html/django-project/helloapp$ which pip
/var/www/html/django-project/helloapp/env/bin/pip

我有同樣的問題,我通過刪除與系統包管理器( apt-get等)一起安裝的 gunicorn 解決了這個問題。

apt-get將 gunicorn 安裝到python2 的站點包pipDjango安裝到python3 的站點包 所以 Gunicorn 和 Django 不在同一個 site-packages 目錄中。 所以gunicorn找不到django。 在同一個包目錄中安裝 Gunicorn 和 Django 應該可以解決問題。

/etc/systemd/system/gunicorn.service ,確保您的工作目錄指向您的應用程序目錄。

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application

這個特定問題可能不是這種情況但是我遇到了一個類似的問題並且是由谷歌領導的。 所以我把這個答案放在這里,希望對其他人有用。

我的問題是,gunicorn 是由globally installed package運行的,而不是安裝在虛擬環境中的包。 要確保您是否屬於這種情況,只需運行which gunicorn並檢查它是否來自您的 virtualenv bin 目錄。 如果它不是來自您的虛擬 env bin 目錄,請按照以下步驟操作:

  1. 停用環境。
    • deactivate env
  2. 卸載了全局安裝的gunicro
    • pip uninstall gunicorn
  3. 激活環境。 [我使用 virtualenvwrapper 進行 virtualenv 管理,我建議你這樣做。 ]
    • workon env

現在 gunicorn 應該按預期工作。

您實際上應該按如下方式運行它:

gunicorn helloapp.wsgi:application 
  • gunicorn的基本用法:

gunicorn [OPTIONS] APP_MODULE

其中APP_MODULE的模式$(MODULE_NAME):$(VARIABLE_NAME)

錯誤的目錄:

在調用之前檢查您的當前目錄,然后cd到正確的目錄。

例子:

不正確:

~/project_name/main$ gunicorn3 --bind 0.0.0.0:8000 main.wsgi:application

正確:

~/project_name/main$ cd ..
~/project_name$ gunicorn3 --bind 0.0.0.0:8000 main.wsgi:application

我正在使用詩歌和 pyenv。 就我而言,事實證明我正在運行的 gunicorn 實例引用的是系統級安裝,而不是安裝在虛擬環境中的安裝。 我通過運行which gunicorn並將其與pyenv which gunicorn的輸出進行比較來pyenv which gunicorn

為我解決的是什么

$(pyenv which gunicorn) <app_name>.wsgi:application --bind 0.0.0.0

正如此處和其他地方所指出的,錯誤消息所指出的問題的根源是gunicorn找不到 django 模塊。 那么問題就變成了為什么會這樣,可能有許多不同的原因。 在我的情況下,在沒有 virtualenv 的 Ubuntu 仿生主機上,這是因為我已經安裝了 python3-django 和 gunicorn(后者是一個 python2 包)。

解決方案是安裝 python3-gunicorn,刪除 gunicorn 並運行 gunicorn 作為gunicorn3

暫無
暫無

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

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