Gunicorn,没有名为'myproject的模块

Goo*_*dea 39 python django nginx gunicorn

我正在新服务器上安装以前构建的网站.我不是原来的开发者.

我过去使用了Gunicorn + nginx来保持应用程序的活着(基本上遵循本教程),但我在这里遇到问题.

source venv/bin/activate,然后./manage.py runserver 0.0.0.0:8000运作良好,一切都按预期运行.我将其关闭并运行gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application,并获得以下信息:

[2016-09-13 01:11:47 +0000] [15259] [INFO] Starting gunicorn 19.6.0
[2016-09-13 01:11:47 +0000] [15259] [INFO] Listening at: http://0.0.0.0:8000 (15259)
[2016-09-13 01:11:47 +0000] [15259] [INFO] Using worker: sync
[2016-09-13 01:11:47 +0000] [15262] [INFO] Booting worker with pid: 15262
[2016-09-13 01:11:47 +0000] [15262] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker
    worker.init_process()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/workers/base.py", line 126, in init_process
    self.load_wsgi()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/util.py", line 357, in import_app
    __import__(module)
ImportError: No module named 'myproject.wsgi'
[2016-09-13 01:11:47 +0000] [15262] [INFO] Worker exiting (pid: 15262)
[2016-09-13 01:11:47 +0000] [15259] [INFO] Shutting down: Master
[2016-09-13 01:11:47 +0000] [15259] [INFO] Reason: Worker failed to boot.
Run Code Online (Sandbox Code Playgroud)

我认为它与整个应用程序的结构有关.之前,我已经构建了具有以下基本结构的应用程序:

myproject
??? manage.py
??? myproject
?   ??? urls.py
?   ??? views.py
?   ??? component1
?   ?   ??? urls.py
?   ?   ??? views.py
?   ??? component2
?   ?   ??? urls.py
?   ?   ??? views.py
??? venv
?   ??? bin
?   ??? ...
Run Code Online (Sandbox Code Playgroud)

相反,这个结构如下:

myproject
??? apps
?   ??? blog
?   ?   ??? urls.py
?   ?   ??? views.py
?   ?     ??? ...
?   ??? catalogue
?   ?   ??? urls.py
?   ?   ??? views.py
?   ?     ??? ...
?   ??? checkout
?   ?   ??? urls.py
?   ?   ??? views.py
?   ?     ??? ...
?   ??? core
?   ?   ??? urls.py
?   ?   ??? views.py
?   ?     ??? ...
?   ??? customer
?   ??? dashboard
?   ???  __init__.py
??? __init__.py
??? manage.py
??? project_static
?   ??? assets
?   ??? bower_components
?   ??? js
??? public
?   ??? emails
?   ??? media
?   ??? static
??? settings
?   ??? base.py
?   ??? dev.py
?   ??? __init__.py
?   ??? local.py
?   ??? production.py
??? templates
?   ??? base.html
?   ??? basket
?   ??? blog
?   ??? ....
??? urls.py
??? venv
?   ??? bin
?   ??? include
?   ??? lib
?   ??? pip-selfcheck.json
?   ??? share
??? wsgi.py
Run Code Online (Sandbox Code Playgroud)

因此,没有"主要"模块运行该节目,这是我所期待的gunicorn正在寻找的.

有什么想法吗?

wsgi.py:

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)

Pau*_*tte 54

您的错误消息是

ImportError: No module named 'myproject.wsgi'
Run Code Online (Sandbox Code Playgroud)

你运行了应用程序

gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
Run Code Online (Sandbox Code Playgroud)

并且wsgi.py有这条线

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
Run Code Online (Sandbox Code Playgroud)

这是断开连接.为了认识该项目作为myproject.wsgi目录必须是python的路径上运行...

cd .. && gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
Run Code Online (Sandbox Code Playgroud)

会消除这个错误.但是,您将获得不同的错误,因为wsgi.py文件引用settings而不是myproject.settings.这意味着该应用程序旨在从根目录而不是一个目录运行.您可以通过查看代码来确定这一点 - 如果它使用绝对导入,他们通常会说from myproject.app import ...from app import ....如果猜测正确,那么你的正确命令就是

gunicorn --bind 0.0.0.0:8000 wsgi:application
Run Code Online (Sandbox Code Playgroud)

如果应用程序确实myproject在所有路径中使用,则必须修改PYTHONPATH以正确运行它...

PYTHONPATH=`pwd`/.. gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,这条线对我有用:`PYTHONPATH=`pwd`/.. gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application` (3认同)
  • 我的挂断是命名约定是python的命名约定而不是目录结构。例如:`myproject.wsgi` 对应于`myproject/wsgi.py` 而不是文件`myproject.wsgi`,其中`wsgi` 是扩展名。感谢您的帮助! (2认同)

小智 6

就我而言,\n我的项目结构是

\n
myproject\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 myproject\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wsgi.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ..\nDockerfile\ndocker-composer.yml\n
Run Code Online (Sandbox Code Playgroud)\n

所以在 docker-composer.yml 中,当命令

\n
\n

Gunicorn myproject.wsgi:application --bind 0.0.0.0:8000

\n
\n

我收到以下错误

\n
\n

ModuleNotFoundError:没有名为“myproject.wsgi”的模块

\n
\n

我们要做的是,我们必须在文件夹中运行gunicorn命令,而不是项目根目录。这是工作代码

\n
sh -c "cd ./myproject && gunicorn myproject.wsgi:application --bind 0.0.0.0:8000"\n
Run Code Online (Sandbox Code Playgroud)\n

在gunicorn命令之前,我们必须使用“cd ./project”更改目录。在“myproject”目录下,gunicorn可以清楚地识别我们的项目。

\n