Supervisor, Celery, Virtualenvwrapper, Django: не удалось импортировать настройки django, даже когда pythonpath добавлен в среду
Кто-нибудь может увидеть, что я здесь делаю не так? Независимо от того, что я пытаюсь, я не могу настроить его для правильного определения настроек Django. Работает нормально при запуске вручную в терминале в активном virtualenv.
Руководитель
[program:celery_beetlejuice]
command = /home/padraic/.virtualenvs/beetlejuice/bin/python /home/padraic/CodeDev/beetlejuice/beetlejuice_django/manage.py celeryd -B -E -l INFO
directory=/home/padraic/CodeDev/beetlejuice/beetlejuice_django
environment=PYTHONPATH="/home/padraic/CodeDev/beetlejuice/beetlejuice_django", DJANGO_SETTINGS_MODULE="beetlejuice_django.settings"
user = padraic
autostart=true
autorestart=true
stdout_logfile=/home/padraic/CodeDev/beetlejuice/beetlejuice_django/logs/celeryd.log
stderr_logfile=/home/padraic/CodeDev/beetlejuice/beetlejuice_django/logs/celeryd.log
redirect_stderr=true
priority=998
numprocs=1
Проследить
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/padraic/.virtualenvs/beetlejuice/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 453, in execute_from_command_line
utility.execute()
File "/home/padraic/.virtualenvs/beetlejuice/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/padraic/.virtualenvs/beetlejuice/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 263, in fetch_command
app_name = get_commands()[subcommand]
File "/home/padraic/.virtualenvs/beetlejuice/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 109, in get_commands
apps = settings.INSTALLED_APPS
File "/home/padraic/.virtualenvs/beetlejuice/local/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__
self._setup(name)
File "/home/padraic/.virtualenvs/beetlejuice/local/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup
self._wrapped = Settings(settings_module)
File "/home/padraic/.virtualenvs/beetlejuice/local/lib/python2.7/site-packages/django/conf/__init__.py", line 134, in __init__
raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings 'beetlejuice_django.settings' (Is it on sys.path?):
1 ответ
Вздох... разобрался с ошибкой...
Так! У меня есть файл settings.py, который содержит:
[settings.py]
import os
BEETLEJUICE_STATE = os.environ.get('BTJC_STATE', None)
if BEETLEJUICE_STATE == 'LOCAL':
from local_settings import *
elif BEETLEJUICE_STATE == 'DEV':
from development_settings import *
elif BEETLEJUICE_STATE == 'PROD':
from production_settings import *
else:
raise ImportError
<aside>
... который раньше был правильным способом делать вещи (или так мне сказали). Я планирую переключиться на способ, который Одри и Дэнни рекомендуют в " Два совка Джанго", суть которого заключается в следующем:
settings/
__init__.py
base.py
local.py
test.py
production.py
... и теперь явно вызывать мои файлы настроек, напримерpython manage.py runserver --settings='settings.production'
... который импортирует из base.py
и имеет все производственные настройки.</aside>
... и я экспортировал BTJC_STATE в virtualenvwrapper postactivate
файл, за исключением того, что, запустив celeryd через supervisor, я ничего не активировал и тем самым полностью пропустил этот файл! Это вызвало ошибку ImportError, но я не понял, откуда она взялась =(
Добавление строки, поясняющей исключение, является хорошей идеей... и, очевидно, использование ImproperlyConfigured является лучшим способом решения этой проблемы. Таким образом, изменив одну строку ниже в моем файле.conf, он начал работать отлично.
[program:celery_beetlejuice]
<snip>
environment=BTJC_STATE='LOCAL'
<snip>
Так что теперь это работает, и я счастлив, но мне нужно найти хороший способ установки переменных окружения (таких как пароли базы данных, ключи API и т. Д.), Которые будут хорошо работать для неактивированного внутреннего использования virtualenv.
Все советы приветствуются, напишите мне, и я дополню это решением =)