Django проектная иерархия / организация - PullRequest
6 голосов
/ 01 апреля 2011

Я новичок в Django и начинаю проект, и я хотел бы сделать это правильно.

Я хотел бы знать, что вы считаете лучшей практикой для организации проекта.

Вот несколько вопросов, которые у меня есть:

  • Как отделить статические ресурсы от кода Python, чтобы не тратить время на обработку статического содержимого с помощью Django?
  • Поскольку приложения являются повторно используемыми модулями, они не очень тесно связаны с проектом, поэтому должны ли они находиться в каталоге проекта или в другом каталоге, который будет содержать все мои «домашние» приложения?
  • Считается ли шаблоныстатический или динамический контент?

Вот моя текущая файловая иерархия:

webapps/
    myproject/
        apache/
        bin/
        lib/
        templates/
            app1/
            app2/
        src/
            app1/
            app2/
            __init.py
            settings.py
            urls.py
            manage.py
        myproject.wsgi
    admin/
    static/
        css/
        img/

Что вы думаете?Что будет лучше?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 01 апреля 2011

Структура вашего каталога также может зависеть от того, какую версию django вы используете.Если вы используете django 1.3, обработка статического содержимого изменилась незначительно.Ваши шаблоны также могут быть расположены отдельно.

Следующее относится только к django 1.3.

В каталоге app:

...
app1/
    static/
        app1/
    templates/
        app1/
    models.py
    ...
    views.py

Если вы используете новое приложение django.contrib.staticfiles , ваши настройки могут выглядеть примерно так:

MEDIA_ROOT = path.join(ROOT_PATH,'uploaded_media/')
MEDIA_URL = '/uploaded_media/'
# static content is collected here, and served from here, but don't add stuff manually here! add to staticfiles_dirs
STATIC_ROOT = path.join(ROOT_PATH, 'collected_static/')
ADMIN_MEDIA_PREFIX = '/static/admin/'
STATIC_URL = '/static/'
# Additional locations of static files
STATICFILES_DIRS = (
    path.join(ROOT_PATH, 'src/extra_static/'),
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

Аналогично, ваши шаблоны можно загружать непосредственно из INSTALLED_APP:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader'
)

TEMPLATE_DIRS = (
    path.join(ROOT_PATH,'src/templates/'),
)

Приведенные выше две стратегии означают, что шаблоны и статический контент могут находиться в своих каталогах приложений.В разработке, используя contrib.staticfiles, статический контент можно обслуживать прямо из папок вашего приложения.В производственной среде есть команда управления для сбора всего статического содержимого каталога приложения в /path/to/project/collected_static/, и вы можете указать своему веб-серверу на этот каталог для обслуживания статического содержимого.

Для предварительно упакованных библиотек, используя virtualenvи пип это отличная идея.В противном случае мне нравится хранить библиотеки в каталоге lib в корневом каталоге проекта.Это делает ссылку на источник, шаблоны и статический контент чрезвычайно удобной, вместо установки на site-packages (особенно, если не используется virtualenv).

Итак, реорганизация структуры вашего проекта:

webapps/
    myproject/
        apache/
        bin/
        lib/
        collected_static/
        uploaded_media/
        myproject.wsgi
        src/
            templates/ # lib template overrides and site wide templates
                base.html
                lib_1/
                    nav.html
            extra_static/
                lib_1/ # libs that dont support django 1.3 static
                    js/
                    css/
            settings.py
            settingslocal.py # keep developer specific settings here
            urls.py
            manage.py
            app1/
                __init.py
                static/
                    app1/
                        js/
                        css/
                templates/
                    app1/
3 голосов
/ 12 апреля 2011

Мой дизайнер не хочет везде искать (по всему пути python) файлы шаблонов.Мой шаблонный макет соответствует вашему: в нем есть одна папка шаблонов, и все приложения находятся под ней.Каждое приложение имеет свой собственный base.html, который расширяет basebase.html.

Здесь в последнее время я начал следовать модели pinax папки приложений, и все приложения включаются туда.Причина этого чисто эстетическая, поскольку Wing показывает мне дерево, все мои приложения сгруппированы вместе в этой части дерева.Что мне не понравилось, так это приложение, которое сортировалось в алфавитном порядке после шаблонов, медиа или site_media.Прокрутка вверх и вниз по дереву замедлила меня.Поместив все приложения в одно место в дереве, git commit -m "feature notes" apps checkins в коде тоже меняется, что является еще одним плюсом.

webapps/
  myvirtenv/
    bin/
    lib/
    myproject/        <- Source control starts here
      site_media/
        collected_static/
          js/
          css/
          img/
        uploaded_media/
      deploy/
          myproject.wsgi
          procmail scripts
          apache site files  # linked from /etc/apache2/sites-endabled
      apps/
        app1/
          templates/       <- This should be here, but in practice I just leave in templates below
            app1/
        app2/
      templates/ # lib template overrides and site wide templates
        basebase.html      <- I changed the name to help my designer
        app1/
        app2/
      settings.py
      gethostname()_local_settings.py # keep machine specific settings here
      urls.py
      manage.py
      requirements
        base.txt
        project.txt

Было слишком много файлов base.html, и говорить об этом было сложно,поэтому basebase.html родился, и с тех пор мы довольны этим.

У меня не было статических файлов, которые не работали бы с приложением staticfiles.Я использовал это приложение с 1.2.Я еще не вернулся и выполнил статические папки версии 1.3, но, вероятно, в следующие несколько месяцев, когда все заработает.

Я получил трюк с папкой требований от pinax.

  1. Создать VirtualENV
  2. URL-адрес git clone
  3. pip install -r требования \ base.txt -r требования \ project.txt
  4. управлять syncdb (если вы используете sqlite, в противном случае высначала нужно выполнить задачи по созданию БД)
  5. символическая ссылка из / etc / apache2
  6. перезагрузить конфигурацию apache
  7. Прибыль!
0 голосов
/ 01 апреля 2011

У тебя были хорошие мысли здесь.Моя первая реакция - спросить, что делает этот каталог администратора?Администратор является частью Django и не нуждается в отдельном модуле - а файлы admin.py для конкретного приложения должны находиться в соответствующих приложениях.

Чтобы ответить на ваши вопросы:

  • разделение статического и динамического: это делается на уровне конфигурации вашего веб-сервера.В вашем случае, для вашего apache virtualhost conf должна быть запись для каталога webapps / static, но не для чего-либо еще. В документации есть хороший пример.

  • Если приложения действительно полностью отделены от вашего проекта, то да, они могут жить вне его, если вы их поместитена питон-путь.Один хороший способ - хранить их в отдельных репозиториях кода и устанавливать их в свой проект с помощью pip и virtualenv.Тем не менее, я думаю, вы обнаружите, что многие из ваших приложений будут относиться к конкретным проектам, поэтому живите в каталоге вашего проекта.

  • Шаблоны - это совершенно определенно динамический контент.Если вы обслуживаете их напрямую через Apache, они не будут анализироваться, поэтому ваши пользователи увидят код переменной и коды блоков, а не значения.

...