Django manage.py syncdb не может найти мой файл настроек на CentOS - PullRequest
0 голосов
/ 23 января 2012

Я развертываю свое приложение django на сервере CentOS 5.5 , с django-1.1.4 over python-2.6.5 .

У меня есть несколько файлов настроек в папке myapp/settings/.

Я хотел бы запустить syncdb; вот что я делаю (с myapp внутри myproject папки):

$> cd /var/www/apps/myproject
$> export PYTHONPATH=/var/www/apps/myproject
$> export DJANGO_SETTINGS_MODULE=myapp.settings.my_serverconfig
$> python26 myapp/manage.py syncdb

Затем Django выдает ошибку, подобную этой:

Error: Can't find the file 'settings.py' in the directory containing 'myapp/manage.py'. It appears you've customized things.
You'll have to run django-admin.py, passing it your settings module.
(If the file settings.py does indeed exist, it's causing an ImportError somehow.)

Traceback (most recent call last):
  File "emon/manage.py", line 17, in <module>
    execute_manager(settings)
  File "/usr/lib/python2.6/site-packages/django/core/management/__init__.py", line 360, in execute_manager
    setup_environ(settings_mod)
File "/usr/lib/python2.6/site-packages/django/core/management/__init__.py", line 343, in setup_environ
    project_module = import_module(project_name)
File "/usr/lib/python2.6/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named my_serverconfig

В файле myapp.wsgi к os.path добавляется путь myproject, также устанавливается os.environ['DJANGO_SETTINGS_MODULE']. Apache (через mod_wsgi) может запустить приложение без такой ошибки.

Наконец, это работает под Windows, где я запускаю python-2.6.6 с django-1.1.1 .

$> d:
$> cd d:\Code\myproject
$> export PYTHONPATH=d:\Code\myproject
$> export DJANGO_SETTINGS_MODULE=myapp.settings.dev_settings
$> python.exe myapp/manage.py syncdb

Я знаю, что версии не совпадают, но я не уверен, что незначительные различия могут вызвать все мои беды. Более того, я не могу найти точно такую ​​же версию Python для Windows.

Есть мысли? Большое спасибо за чтение.

О.

РЕДАКТИРОВАТЬ: добавил manage.py содержание

#!/usr/bin/env python
from django.core.management import execute_manager
import os


    if __name__ == "__main__":
    settings = None
    try:
        if os.environ.has_key('LOCAL_SERVER_SETTINGS'):
            os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings.%s' % os.environ['LOCAL_SERVER_SETTINGS']

        if os.environ.has_key('DJANGO_SETTINGS_MODULE'):
            settings = __import__(os.environ['DJANGO_SETTINGS_MODULE'])

        if settings is None:
            import settings
        execute_manager(settings)

    except ImportError:
        import sys
        sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)

        import traceback
        traceback.print_exc()

        sys.exit(1)

РЕДАКТИРОВАТЬ: подробнее о том, что происходит в пакете myapp

Я исправляю некоторые функции / классы django из модуля myapp.__init__. Я думал, что import django часть в этом модуле вызывает круговую ссылку. Код выполняется, когда я загружаю myapp.settings. [Any_config] и мог вызвать сбой. Но почему же WSGI безошибочно загружает модуль с правильными настройками и что он хорошо работает и в Windows? Более того: после комментирования указанных частей кода ошибка ImportError все еще существует.

1 Ответ

0 голосов
/ 23 января 2012

Если вы переместите файл настроек, вам нужно изменить manage.py, чтобы указать, где его найти.По умолчанию он находится в том же каталоге, что и manage.py, но если вы переместитесь в другой модуль python (папка с __init__.py), вам нужно обновить ссылку в manage.py.

Lookв manage.py, куда он импортирует ваш модуль настроек, и вместо этого импортируйте settings.dev_settings в вашем случае.Найдите две важные строки

imp.find_module('settings') # Assumed to be in the same directory.
...
import settings

Измените их на ссылку, куда вы переместили файл настроек (при условии, что вы переместились в settings.dev_settings):

imp.find_module('settings.dev_settings') # Assumed to be in the same directory.
...
from settings import dev_settings as settings

Вы также можете использовать командуопция строки --settings для указания, какой файл настроек использовать.

...