Django项目工作目录结构的最佳实践

时间:2014-04-03 15:09:59

标签: django directory-structure organization project-structure

我知道实际上没有单一的正确方法。但是我发现很难创建一个运行良好的目录结构,并为每个开发人员和管理员保持干净。 github上的大多数项目都有一些标准结构。但它没有显示在PC上组织其他文件和所有项目的方法。

在开发机器上组织所有这些目录的最方便的方法是什么?你如何命名它们,以及如何将其连接并部署到服务器?

  • 项目(您正在处理的所有项目)
  • 源文件(应用程序本身)
  • 存储库的工作副本(我使用git)
  • 虚拟环境(我更喜欢将其置于项目附近)
  • 静态根(对于已编译的静态文件)
  • 媒体根(用于上传的媒体文件)
  • 自述
  • LICENSE
  • 文档
  • 草图
  • 示例(使用此项目提供的应用程序的示例项目)
  • 数据库(如果使用sqlite)
  • 您在项目上成功完成工作通常需要的任何其他内容

我想解决的问题:

  • 目录的好名称,以便明确其目的。
  • 将所有项目文件(包括virtualenv)保存在一个位置,这样我就可以轻松复制,移动,存档,删除整个项目或估算磁盘空间使用情况。
  • 创建一些选定文件集的多个副本,例如整个应用程序,存储库或virtualenv,同时保留我不想克隆的其他文件的单个副本。
  • 只需通过rsyncing选定的一个目录,将正确的文件集部署到服务器。

6 个答案:

答案 0 :(得分:199)

我的~/projects/目录中有两种Django“项目”,两者都有不同的结构。:

  • 独立网站
  • 可插拔应用程序

独立网站

主要是私人项目,但不一定是。通常看起来像这样:

~/projects/project_name/

docs/               # documentation
scripts/
  manage.py         # installed to PATH via setup.py
project_name/       # project dir (the one which django-admin.py creates)
  apps/             # project-specific applications
    accounts/       # most frequent app, with custom user model
    __init__.py
    ...
  settings/         # settings for different environments, see below
    __init__.py
    production.py
    development.py
    ...

  __init__.py       # contains project version
  urls.py
  wsgi.py
static/             # site-specific static files
templates/          # site-specific templates
tests/              # site-specific tests (mostly in-browser ones)
tmp/                # excluded from git
setup.py
requirements.txt
requirements_dev.txt
pytest.ini
...

设置

主要设置是生产设置。其他文件(例如staging.pydevelopment.py)只需从production.py导入所有内容,并仅覆盖必要的变量。

对于每个环境,都有单独的设置文件,例如。生产, 发展。我有一些项目,我也测试(测试运行),分阶段 (作为最终部署前的检查)和heroku(用于部署到heroku)设置。

要求

我宁愿直接在setup.py中指定需求。只有那些所需要的 我在requirements_dev.txt中的开发/测试环境。

某些服务(例如heroku)需要在根目录中有requirements.txt

setup.py

使用setuptools部署项目时很有用。它将manage.py添加到PATH,因此我可以直接(任何地方)运行manage.py

项目特定的应用

我曾经把这些应用放到project_name/apps/目录中并导入它们 使用相对进口。

模板/静态/区域设置/测试文件

我将这些模板和静态文件放入全局模板/静态目录中,而不是放在每个应用程序中。 这些文件通常由不关心项目代码的人编辑 结构或python。如果你是全栈开发人员独自工作或 在一个小团队中,您可以创建每个应用程序模板/静态目录。这真的只是一种品味问题。

同样适用于区域设置,尽管有时创建单独的区域设置目录很方便。

测试通常最好放在每个应用程序中,但通常有很多 集成/功能测试,测试更多的应用程序协同工作,全球化 测试目录确实有意义。

Tmp目录

项目根目录中有临时目录,从VCS中排除。它已经习惯了 在开发期间存储媒体/静态文件和sqlite数据库。一切都在 可以随时删除tmp而不会有任何问题。

VIRTUALENV

我更喜欢virtualenvwrapper并将所有的venv放入~/.venvs目录, 但你可以将它放在tmp/里面以保持在一起。

项目模板

我已为此设置创建了项目模板django-start-template

部署

此项目的部署如下:

source $VENV/bin/activate
export DJANGO_SETTINGS_MODULE=project_name.settings.production
git pull
pip install -r requirements.txt

# Update database, static files, locales
manage.py syncdb  --noinput
manage.py migrate
manage.py collectstatic --noinput
manage.py makemessages -a
manage.py compilemessages

# restart wsgi
touch project_name/wsgi.py

您可以使用rsync代替git,但仍需要运行一批命令来更新您的环境。

最近,我制作了[django-deploy][2]应用程序,它允许我运行单一管理命令来更新环境,但我只将它用于一个项目而且我还在尝试它。

草图和草稿

我放在全局templates/目录中的模板草稿。我想可以在项目根目录中创建文件夹sketches/,但尚未使用它。

可插拔应用程序

这些应用程序通常准备作为开源发布。我举了个例子 低于django-forme

~/projects/django-app/

docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...

目录名称清晰(我希望)。我把测试文件放在app目录之外, 但这真的没关系。提供READMEsetup.py非常重要,因此可以通过pip轻松安装包。

答案 1 :(得分:14)

我的回答是基于我自己的工作经验,主要是在我强烈推荐的书Two Scoops of Django中,以及在哪里可以找到更详细的一切解释。我只想回答一些问题,欢迎任何改进或纠正。但也可以有更正确的方式来达到同样的目的。

<强>项目
我的个人目录中有一个主文件夹,用于维护我正在处理的所有项目。

源文件
我个人使用django项目root作为我项目的存储库根目录。但是在本书中建议将两者分开。我认为这是一种更好的方法,所以我希望我的项目能够逐步改变。

project_repository_folder/
    .gitignore
    Makefile
    LICENSE.rst
    docs/
    README.rst
    requirements.txt
    project_folder/
        manage.py
        media/
        app-1/
        app-2/
        ...
        app-n/
        static/
        templates/
        project/
            __init__.py
            settings/
                __init__.py
                base.py
                dev.py
                local.py
                test.py
                production.py
            ulrs.py
            wsgi.py

<强>存储库
Git或Mercurial似乎是Django开发人员中最受欢迎的版本控制系统。最受欢迎的备份托管服务GitHubBitbucket

虚拟环境
我使用virtualenv和virtualenvwrapper。安装第二个后,您需要设置工作目录。我在 / home / envs 目录中,因为它建议在virtualenvwrapper安装指南中使用。但我认为最重要的是它放在哪里。使用虚拟环境时最重要的事情是使requirements.txt文件保持最新。

pip freeze -l > requirements.txt 

静态根
项目文件夹

Media Root
项目文件夹

自述文件
存储库根目录

LICENSE
存储库根目录

文件
存储库根目录。这个python包可以帮助您更轻松地保存文档:

草图

示例

数据库

答案 2 :(得分:6)

我不想创建新的settings/目录。我只是添加名为settings_dev.pysettings_production.py的文件,因此我不必编辑BASE_DIR。 下面的方法增加了默认结构,而不是改变它。

mysite/                   # Project
    conf/
        locale/
            en_US/
            fr_FR/
            it_IT/
    mysite/
        __init__.py
        settings.py
        settings_dev.py
        settings_production.py
        urls.py
        wsgi.py
    static/
        admin/
            css/           # Custom back end styles
        css/               # Project front end styles
        fonts/
        images/
        js/
        sass/
    staticfiles/
    templates/             # Project templates
        includes/
            footer.html
            header.html
        index.html
    myapp/                 # Application
        core/
        migrations/
            __init__.py
        templates/         # Application templates
            myapp/
                index.html
        static/
            myapp/
                js/  
                css/
                images/
        __init__.py
        admin.py
        apps.py
        forms.py
        models.py
        models_foo.py
        models_bar.py
        views.py
    templatetags/          # Application with custom context processors and template tags
        __init__.py
        context_processors.py
        templatetags/
            __init__.py
            templatetag_extras.py
    gulpfile.js
    manage.py
    requirements.txt

我想这个:

    settings.py
    settings_dev.py
    settings_production.py

比这更好:

    settings/__init__.py
    settings/base.py
    settings/dev.py
    settings/production.py

此概念也适用于其他文件。

我通常将node_modules/bower_components/放在默认static/文件夹中的项目目录中。

有时Git子模块的vendor/目录,但通常我将它们放在static/文件夹中。

答案 3 :(得分:2)

以下是我在我的系统上的内容。

  1. 所有项目:我的主文件夹中有项目目录,即~/projects。所有项目都在其中。

  2. 个别项目:我遵循许多名为django-skel的开发人员用于单个项目的标准化结构模板。它基本上处理所有静态文件和媒体文件以及所有文件。

  3. 虚拟环境:我家中有 virtualenvs文件夹,用于存储系统中的所有虚拟环境,即~/virtualenvs。这给了我灵活性,我知道我拥有的所有虚拟环境以及可以轻松使用的内容

  4. 以上3是我的工作环境的主要分区。

    您提到的所有其他部分主要依赖于项目到项目(即您可能会为不同的项目使用不同的数据库)。所以他们应该留在他们各自的项目中。

答案 4 :(得分:0)

根据Django文档,可以遵循的正确目录结构是:

[projectname]/                  <- project root
├── [projectname]/              <- Django root
│   ├── __init__.py
│   ├── settings/
│   │   ├── common.py
│   │   ├── development.py
│   │   ├── i18n.py
│   │   ├── __init__.py
│   │   └── production.py
│   ├── urls.py
│   └── wsgi.py
├── apps/
│   └── __init__.py
├── configs/
│   ├── apache2_vhost.sample
│   └── README
├── doc/
│   ├── Makefile
│   └── source/
│       └── *snap*
├── manage.py
├── README.rst
├── run/
│   ├── media/
│   │   └── README
│   ├── README
│   └── static/
│       └── README
├── static/
│   └── README
└── templates/
    ├── base.html
    ├── core
    │   └── login.html
    └── README

有关最新目录结构,请参考https://django-project-skeleton.readthedocs.io/en/latest/structure.html

答案 5 :(得分:0)

您可以使用https://github.com/Mischback/django-project-skeleton存储库。

运行以下命令:

$ django-admin startproject --template=https://github.com/Mischback/django-project-skeleton/archive/development.zip [projectname]

结构是这样的:

[projectname]/                  <- project root
├── [projectname]/              <- Django root
│   ├── __init__.py
│   ├── settings/
│   │   ├── common.py
│   │   ├── development.py
│   │   ├── i18n.py
│   │   ├── __init__.py
│   │   └── production.py
│   ├── urls.py
│   └── wsgi.py
├── apps/
│   └── __init__.py
├── configs/
│   ├── apache2_vhost.sample
│   └── README
├── doc/
│   ├── Makefile
│   └── source/
│       └── *snap*
├── manage.py
├── README.rst
├── run/
│   ├── media/
│   │   └── README
│   ├── README
│   └── static/
│       └── README
├── static/
│   └── README
└── templates/
    ├── base.html
    ├── core
    │   └── login.html
    └── README