ImportError:没有名为"config.settings"的模块;'config'不是软件包
我正在尝试让我的cookiecutter-django应用程序通过pip安装在mod_wsgi下的Apache下运行.
I'm trying to get my cookiecutter-django app running under Apache with mod_wsgi installed via pip.
python3 manager.py运行服务器
有效.
但是在Apache中运行它后,出现错误,提示未找到Module config.因此,我 pip install config
.(它尚未安装在我的开发系统上.)
But after running it in Apache, I got an error saying Module config not found. So I pip install config
. (It is not installed on my development system.)
将config.py文件放入我的/usr/local/pulseenv/lib/python3.5/site-packages中.
That put a config.py file in my /usr/local/pulseenv/lib/python3.5/site-packages.
该文件具有我修复的各种语法错误.据我所知,这些错误是由于python 2.7和3.5之间的变化所致.
That file had various syntax errors which I fixed. The errors were due to changes between python 2.7 and 3.5 as far as I can tell.
但是现在我遇到了这个错误,我被困在哪里了:
But now I get this error and I'm stuck where to go from here:
ImportError: No module named 'config.settings'; 'config' is not a package
在error.log中没有看到有关如何进一步跟踪错误的任何线索.那么这个模块是什么呢?我为什么需要它?而如何找出我的问题呢?
I don't see any clues in the error.log on how to further trace the error. So what is this module? Why do I need it? And how to figure out my problem is?
这是我的虚拟主机文件(/etc/apache2/sites-available/000-default.conf):
Here's my vhost file (/etc/apache2/sites-available/000-default.conf):
<VirtualHost *:80>
ServerAdmin webmaster@localhost
#DocumentRoot /var/www/html
DocumentRoot /var/www/pulsemanager/pulsemanager
Alias /static /var/www/pulsemanager/pulsemanager/static
<Directory /var/www/pulsemanager/pulsemanager/static>
Require all granted
</Directory>
<Directory /var/www/pulsemanager/config>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIScriptAlias / /var/www/pulsemanager/config/wsgi.py
WSGIDaemonProcess pulsemanager
WSGIProcessGroup pulsemanager
WSGIApplicationGroup %{GLOBAL}
</VirtualHost>
我的项目的布局为:
ubuntu@ip-172-31-84-213:/var/www/pulsemanager$ ls
conf docs instantdudiobook.ipynb package.json pytest.ini reqs.txt setup.cfg
config env.example LICENSE pulsemanager README.md reqs.txt.sav survey2.txt
CONTRIBUTORS.txt gulpfile.js manage.py pulsenotebook.ipynb README.rst requirements utility
ubuntu@ip-172-31-84-213:/var/www/pulsemanager$ cd pulsemanager/
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/pulsemanager$ ls
contrib locale lsrc3 static surveys templates users
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/pulsemanager$
这是我的致命环境:
ubuntu@ip-172-31-84-213:/usr/local/pulseenv$ ls
bin include lib lib64 pip-selfcheck.json pyvenv.cfg share
ubuntu@ip-172-31-84-213:/usr/local/pulseenv$ cd lib
ubuntu@ip-172-31-84-213:/usr/local/pulseenv/lib$ pip3 list
Package Version
----------------------------- ----------------------
apturl 0.5.2
argon2 0.1.10
argon2-cffi 18.1.0
arrow 0.12.1
beautifulsoup4 4.4.1
binaryornot 0.4.4
blinker 1.3
Brlapi 0.6.4
cairocffi 0.8.0
certifi 2018.1.18
cffi 1.11.5
chardet 3.0.4
checkbox-support 0.22
click 6.7
config 0.3.9
cloud-init 18.2
command-not-found 0.3
configobj 5.0.6
cookiecutter 1.6.0
cryptography 1.2.3
cssselect2 0.2.1
cycler 0.10.0
defer 1.0.6
defusedxml 0.5.0
Django 2.0.3
django-admin-tools 0.8.1
django-allauth 0.35.0
django-autoslug 1.9.3
django-crispy-forms 1.7.2
django-debug-toolbar 1.9.1
django-environ 0.4.4
django-extensions 2.0.6
django-language-field 0.0.3
django-model-utils 3.1.1
feedparser 5.1.3
future 0.16.0
guacamole 0.9.2
hibagent 1.0.1
httplib2 0.9.1
idna 2.6
Jinja2 2.8
jinja2-time 0.2.0
jsonpatch 1.10
jsonpointer 1.9
language-selector 0.1
louis 2.6.4
lxml 3.5.0
Mako 1.0.3
MarkupSafe 0.23
oauthlib 1.0.3
onboard 1.2.0
padme 1.1.1
pdfrw 0.4
pexpect 4.0.1
pip 10.0.1
plainbox 0.25
poyo 0.4.1
prettytable 0.7.2
ptyprocess 0.5
pyasn1 0.1.9
pycparser 2.18
pycups 1.9.73
pycurl 7.43.0
pygobject 3.20.0
PyJWT 1.3.0
pyparsing 2.0.3
Pyphen 0.9.4
pyserial 3.0.1
python-apt 1.1.0b1+ubuntu0.16.4.1
python-dateutil 2.7.0
python-debian 0.1.27
python-systemd 231
python3-openid 3.1.0
pytz 2018.3
pyxdg 0.25
PyYAML 3.11
reportlab 3.3.0
requests 2.18.4
requests-oauthlib 0.8.0
sessioninstaller 0.0.0
setuptools 39.1.0
six 1.10.0
sqlparse 0.2.4
ssh-import-id 5.5
system-service 0.3
tinycss2 0.6.1
ubuntu-drivers-common 0.0.0
ufw 0.35
unattended-upgrades 0.1
unity-scope-calculator 0.1
unity-scope-chromiumbookmarks 0.1
unity-scope-colourlovers 0.1
unity-scope-devhelp 0.1
unity-scope-firefoxbookmarks 0.1
unity-scope-gdrive 0.7
unity-scope-manpages 0.1
unity-scope-openclipart 0.1
unity-scope-texdoc 0.1
unity-scope-tomboy 0.1
unity-scope-virtualbox 0.1
unity-scope-yelp 0.1
unity-scope-zotero 0.1
urllib3 1.22
usb-creator 0.3.0
webencodings 0.5.1
wheel 0.29.0
whichcraft 0.4.1
xdiagnose 3.8.4.1
xkit 0.0.0
XlsxWriter 0.7.3
我确实有一个配置目录:
I do have a config directory:
ubuntu@ip-172-31-84-213:~$ cd /var/www/pulsemanager/config/
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/config$ ls
__init__.py __pycache__ settings urls.py wsgi.py
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/config$ cd settings
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/config/settings$ ls
base.py __init__.py local.py production.py __pycache__ test.py
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/config/settings$
这是我的wsgi.py.似乎DJANGO_SETTINGS_MODULE应该默认为config.settings.production(/var/pulsemanager/config/settings/production.py):
And here's my wsgi.py. Seems like DJANGO_SETTINGS_MODULE should be defaulting to config.settings.production (/var/pulsemanager/config/settings/production.py):
"""
WSGI config for pulsemanager project.
"""
import os
import sys
from django.core.wsgi import get_wsgi_application
# This allows easy placement of apps within the interior
# pulsemanager directory.
app_path = os.path.dirname(os.path.abspath(__file__)).replace('/config', '')
sys.path.append(os.path.join(app_path, 'pulsemanager'))
if os.environ.get('DJANGO_SETTINGS_MODULE') == 'config.settings.production':
from raven.contrib.django.raven_compat.middleware.wsgi import Sentry
# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
# if running multiple sites in the same mod_wsgi process. To fix this, use
# mod_wsgi daemon mode with each site in its own daemon process, or use
# os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
application = get_wsgi_application()
if os.environ.get('DJANGO_SETTINGS_MODULE') == 'config.settings.production':
application = Sentry(application)
# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)
我删除了配置包.我很确定那是一条红鲱鱼.我看到一些对"config"的引用,例如 os.environ.setdefault("DJANGO_SETTINGS_MODULE","config.settings.production")
和 app_path = os.path.dirname(os.pathwsgi.py中的.abspath(__ file __)).replace('/config','')
这些问题之一是我的问题所在吗?
I removed the config package. I'm pretty sure that was a red herring. I see several references to 'config', e.g os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
and app_path = os.path.dirname(os.path.abspath(__file__)).replace('/config', '')
in wsgi.py. Is one of these things where my problem is?
我在 config/__ init __.py
中添加了 export DJANGO_SETTINGS_MODULE = config.settings.production
,甚至尝试将 os.environ ["DJANGO_SETTINGS_MODULE"] ="config.settings.production"
放在wsgi.py顶部附近.
I added export DJANGO_SETTINGS_MODULE=config.settings.production
to config/__init__.py
and even tried putting os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production"
near the top of wsgi.py.
我将WSGIDaemonProcess更新为:
I updated WSGIDaemonProcess to:
WSGIDaemonProcess pulsemanager python-home=/usr/local/pulseenv/ python-path=/var/www/pulsemanager/pulsemanager:/usr/local/pulseenv/lib/python3.5/site-packages
但是我仍然得到:
ImportError: No module named 'config'
更多的错误.日志
[Tue May 08 16:58:33.360155 2018] [mpm_event:notice] [pid 7420:tid 139690171062144] AH00489: Apache/2.4.18 (Ubuntu) OpenSSL/1.0.2g mod_wsgi/4.6.4 Python/3.5 configured -- resuming normal operations
[Tue May 08 16:58:33.360248 2018] [core:notice] [pid 7420:tid 139690171062144] AH00094: Command line: '/usr/sbin/apache2'
[Tue May 08 16:58:33.414142 2018] [wsgi:info] [pid 7423:tid 139690171062144] mod_wsgi (pid=7423): Attach interpreter ''.
[Tue May 08 16:58:33.437248 2018] [wsgi:info] [pid 7423:tid 139690171062144] mod_wsgi (pid=7423): Adding '/var/www/pulsemanager/pulsemanager' to path.
[Tue May 08 16:58:33.441845 2018] [wsgi:info] [pid 7423:tid 139690171062144] mod_wsgi (pid=7423): Adding '/usr/local/pulseenv/lib/python3.5/site-packages' to path.
[Tue May 08 16:58:33.449915 2018] [wsgi:info] [pid 7423:tid 139690171062144] mod_wsgi (pid=7423): Imported 'mod_wsgi'.
[Tue May 08 16:58:33.454029 2018] [wsgi:info] [pid 7423:tid 139690021156608] [remote 172.31.6.98:39831] mod_wsgi (pid=7423, process='pulsemanager', application=''): Loading Python script file '/var/www/pulsemanager/config/wsgi.py'.
[Tue May 08 16:58:33.683108 2018] [wsgi:error] [pid 7423:tid 139690021156608] [remote 172.31.6.98:39831] mod_wsgi (pid=7423): Failed to exec Python script file '/var/www/pulsemanager/config/wsgi.py'.
[Tue May 08 16:58:33.683161 2018] [wsgi:error] [pid 7423:tid 139690021156608] [remote 172.31.6.98:39831] mod_wsgi (pid=7423): Exception occurred processing WSGI script '/var/www/pulsemanager/config/wsgi.py'.
...
[Tue May 08 16:59:13.003234 2018] [wsgi:error] [pid 7423:tid 139689928836864] [remote 172.31.93.15:41324] ImportError: No module named 'config'
您的 DJANGO_SETTINGS_MODULE
需要指定项目根文件夹中存在的软件包或模块.
Your DJANGO_SETTINGS_MODULE
needs to specify a package or module that exists in the project root folder.
[pulsemanager]/
├── [config]/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
使用mod_wsgi守护程序模式
Using mod_wsgi Daemon Mode
WSGIDaemonProcess pulsemanager python-home=/path/to/venv/
WSGIProcessGroup pulsemanager
对于在单个mod_wsgi进程中运行的多个站点,所有站点都将使用碰巧先运行的站点的设置.可以通过以下方法解决:
For multiple sites run in a single mod_wsgi process, all of them will use the settings of whichever one happens to run first. This can be solved by changing:
os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings.{{env}}"
更新了wsgi.py
Updated wsgi.py
import os
import sys
from django.core.wsgi import get_wsgi_application
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pulsemanager.settings.production")
if os.environ.get("DJANGO_SETTINGS_MODULE") == "pulsemanager.settings.production":
from raven.contrib.django.raven_compat.middleware.wsgi import Sentry
application = Sentry(get_wsgi_application())
else:
get_wsgi_application()