Установка приложений Django вне папки проекта? - PullRequest
2 голосов
/ 04 августа 2011

По причинам полной глупости я хочу полностью изменить структуру файловой системы моего проекта Django.В частности, я хочу переместить реальные приложения, составляющие сайт, в отдельные папки из файлов admin / settings.Например, вместо:

django/
    site/
        __init__.py
        manage.py
        settings.py
        urls.py
        home/
            __init__.py
            views.py
            models.py
            template.html
        page/
            __init__.py
            views.py
            models.py
            template.html
        media/
            __init__.py
            styles.css
            picture1.jpg
            picture2.jpg

Я хочу, чтобы оно было:

django/
    site/
        __init__.py
        manage.py
        settings.py
        urls.py
    home/
        __init__.py
        views.py
        models.py
        template.html
    page/
        __init__.py
        views.py
        models.py
        template.html
    media/
        __init__.py
        styles.css
        picture1.jpg
        picture2.jpg

, потому что я считаю, что N-арное дерево моей файловой системы должно быть максимально сбалансированным, минимизируя еговысота, чтобы гарантировать время поиска O (lgn) для любого конкретного файла !!!

Мне удалось настроить мой django.wsgi таким образом, чтобы все мои "внешние" папки были частью системного пути при запуске Python,поэтому импорт работает отлично.Точно так же я сделал os.chdir (), чтобы сделать загрузку из файловой системы тоже идеально.URL-сопоставитель также отлично работает, направляя входящие запросы к этим «внешним» модулям для обработки.

Однако мне не удалось получить файл manage.py для загрузки этих «внешних» модулей, возможно потому, что он не 'не запускается через django.wsgi и, следовательно, модификации sys.path к ним не применяются.Следовательно, когда я помещаю эти внешние папки в INSTALLED_APPS (например, «home», а не «site.home»), он не может их найти, давая мне:

Error: No module named home

Всякий раз, когда я пытаюсь python manage.py syncdb,Я попытался установить переменную окружения PYTHONPATH в / home / django в надежде, что это приведет к тому, что любой скрипт Python выполнит проверку этой папки и загрузит мои «внешние» модули, но это тоже не удалось.Есть ли что-нибудь еще, что я могу сделать, чтобы manage.py проверил эти внешние папки при загрузке?

Ответы [ 4 ]

5 голосов
/ 05 августа 2011

При такой настройке вы можете даже полностью отделить свой код от конфигурации сайта django:

site/
    yoursitename/
        __init__.py
        manage.py
        settings.py
        urls.py
src/
    your/
        namespaced/
            apps/
                app1/
                    models.py...
                app2/...

А в settings.py просто загрузите каталог "src" в PYTHONPATH:

SITE_PATH = os.path.abspath(os.path.dirname(__file__))
PROJECT_PATH = os.path.normpath(os.path.join(SITE_PATH, '..', '..'))
SRC_PATH = os.path.join(PROJECT_PATH, 'src')
if SRC_PATH not in sys.path:
    sys.path.insert(0, SRC_PATH)

В конце концов, все «повторно используемые» приложения, которые вы устанавливаете в виде яиц или пипсов, работают одинаково, они просто живут в pythonpath.

0 голосов
/ 06 августа 2011

Если вы упаковываете свои приложения в файл setup.py, вы можете «установить» их в свой virtualenv. Это сделает их доступными для этой среды, но нигде больше.

Я делаю это, даже для одноразовых приложений. Часть процесса развертывания заключается в запуске 'pip install' для каждого моего приложения (или отправки приложений на частный сервер pypi / cheeseshop). Разработка использует 'pip install -e', что означает, что я могу редактировать и запускать без необходимости каждый раз переустанавливать.

0 голосов
/ 05 августа 2011

Так много вещей отсекается от файла настроек и / или пишется относительно manage.py, что по крайней мере я бы оставил их в корневом каталоге.

django/
    __init__.py
    manage.py
    settings.py

    site/
        __init__.py
        urls.py
        other stuff.py
    home/
        __init__.py
        views.py
        models.py
        template.html
    page/
        __init__.py
        views.py
        models.py
        template.html
    media/
        __init__.py
        styles.css
        picture1.jpg
        picture2.jpg
0 голосов
/ 04 августа 2011

Я не могу сказать, что я согласен с вашими мотивами, но я считаю, что проблема по-прежнему с вашим PYTHONPATH. В своем скрипте wsgi попробуйте

import sys

sys.path += ['/home/django']
...