django,pyenv,uwsgi - ModuleNotFoundError:没有名为'django'的模块

时间:2017-02-07 09:54:22

标签: python django uwsgi pyenv

我在/etc/uwsgi/vassals/gsd.ini中有以下附庸配置:

[uwsgi]
plugins = python
env = DJANGO_SETTINGS_MODULE=%n.settings
virtualenv = /home/toogy/.pyenv/versions/%n
chdir = /home/webapps/%n
module = %n.wsgi:application
master = true
vacuum = true
pidfile = /tmp/uwsgi-%n.pid
socket = /tmp/uwsgi-%n.sock
daemonize = /var/log/uwsgi/%n.log
chmod-socket = 666
uid = toogy
gid = toogy

这是我得到的uwsgi日志

Tue Feb  7 10:49:12 2017 - received message 1 from emperor
...gracefully killing workers...
Gracefully killing worker 1 (pid: 31406)...
worker 1 buried after 1 seconds
binary reloading uWSGI...
chdir() to /etc/uwsgi/vassals
closing all non-uwsgi socket fds > 2 (max_fd = 1024)...
found fd 3 mapped to socket 0 (/tmp/uwsgi-gsd.sock)
running /usr/bin/uwsgi
*** has_emperor mode detected (fd: 7) ***
[uWSGI] getting INI configuration from gsd.ini
*** Starting uWSGI 2.0.14 (64bit) on [Tue Feb  7 10:49:13 2017] ***
compiled with version: 6.3.1 20170109 on 18 January 2017 00:35:47
os: Linux-3.14.32-xxxx-grs-ipv6-64 #7 SMP Wed Jan 27 18:05:09 CET 2016
nodename: renard
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 4
current working directory: /etc/uwsgi/vassals
detected binary path: /usr/bin/uwsgi
chdir() to /home/webapps/gsd
your processes number limit is 15700
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 inherited UNIX address /tmp/uwsgi-gsd.sock fd 3
Python version: 3.6.0 (default, Jan 16 2017, 12:12:55)  [GCC 6.3.1 20170109]
PEP 405 virtualenv detected: /home/toogy/.pyenv/versions/gsd
Set PythonHome to /home/toogy/.pyenv/versions/gsd
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x39d21f0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 145536 bytes (142 KB) for 1 cores
*** Operational MODE: single process ***
added /home/webapps/gsd/ to pythonpath.
Traceback (most recent call last):
  File "/home/webapps/gsd/gsd/wsgi.py", line 12, in <module>
    from django.core.wsgi import get_wsgi_application
ModuleNotFoundError: No module named 'django'
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
gracefully (RE)spawned uWSGI master process (pid: 27844)
spawned uWSGI worker 1 (pid: 32312, cores: 1)

找不到django,我不知道为什么因为uwsgi似乎检测到python环境(安装了django )。

此外,它表示Python version: 3.6.0,而我的virtualenv Python版本 3.5.2 。我不知道这是否应该发生。系统Python版本 3.6.0

我正在使用uwsgiuwsgi-plugins-python Arch Linux官方软件包的最新版本。

4 个答案:

答案 0 :(得分:6)

问题是链接到uwsgi的系统级python版本需要与virtualenv相同,我认为这是一个非常愚蠢的事情。

答案 1 :(得分:2)

gsd.ini

看一下
virtualenv = /home/toogy/.pyenv/versions/%n

你有没有在这个virtualenv下安装django

答案 2 :(得分:0)

我还发现了一些我想分享的陷阱:

  • 检查是否将virtualenv(与venvpyhomehome相同)设置为包含bin的目录, includelib,...目录
  • 检查用户(uid)是否可以读取您的项目中的文件以及虚拟环境中的库(以ModuleNotFoundError结尾,而不是权限错误)
  • 使用need-app退出失败(这有助于调试,应该是默认的恕我直言)
  • 使用strict避免在配置中输入错误(这也应该是默认值...)
  • 如果您的test.py运行,请尝试导入项目和虚拟环境的模块,以测试其是否有效。它还有助于添加一个

    import sys
    print(sys.path)
    

您还可以复制打印的sys.path,打开python shell并将sys.path设置为相同的值,然后尝试导入所需的wsgi模块。

答案 3 :(得分:0)

在我的情况下,它使用的是系统范围的 uwsgi ,我正在使用 virtualenv ,因此如果执行

$ which uwsgi

我得到了/usr/local/python3.6/bin/uwsgi

Valentin Iovene 建议您在虚拟环境中使用 uwsgi

我的目录结构是这样的:

~/Env
--/app
--/bin
----/....
----/uwsgi <-- This should be the good one
----/...
--/include
--/lib

应用目录是我的 django 应用所在的目录)

在我的情况下, uwsgi 文件没有执行权限,所以我只执行了:

$ chmod +x ~/Env/bin/uwsgi

最后,在我的应用程序目录下,我执行了uwsgi命令,如下所示:

../bin/uwsgi --http :8000 --module app.wsgi

现在我可以看到我的应用正在运行:)

我正在遵循本指南:https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

下一步是配置 nginx https ...

我知道这是一个较晚的回复,但希望这会有所帮助并分享对我有用的东西。