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

raa*_*cer 144 django directory-structure project-structure organization

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

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

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

我想解决的问题:

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

Tom*_*ich 223

我的~/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
...
Run Code Online (Sandbox Code Playgroud)

设置

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

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

要求

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

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

setup.py

在使用部署项目时很有用setuptools.它增加manage.pyPATH,所以我可以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
Run Code Online (Sandbox Code Playgroud)

您可以使用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
...
Run Code Online (Sandbox Code Playgroud)

目录名称很清楚(我希望).我把测试文件放在app目录之外,但它确实没关系.重要的是要提供READMEsetup.py,所以包装是很容易通过安装pip.


cor*_*cor 15

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

Repository
Git或Mercurial似乎是Django开发人员中最受欢迎的版本控制系统.备份GitHubBitbucket最受欢迎的托管服务.

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

pip freeze -l > requirements.txt 
Run Code Online (Sandbox Code Playgroud)

静态根
项目文件夹

Media Root
Project文件夹

README
存储库根目录

LICENSE
存储库根目录

Documents
Repository root.这个python包可以帮助您更轻松地保存文档:

草图

例子

数据库

  • 所以主应用程序的路径是“projects/todo_project/todo/todo”。“projects”这个词重复了两次,“todo”这个词重复了3次。这看起来像“projects/project/my_project/project_dir/project/project”。名字非常不清楚。这是我试图在目录结构中解决的主要问题之一。我想命名目录以便于理解层次结构。存储库根目录怎么样,你能解释一下为什么它很重要吗?另外,您能否解释一下将 envs 保留在主项目目录之外的好处? (2认同)

isa*_*sar 9

我不喜欢创建一个新settings/目录.我只是添加名为的文件settings_dev.py,settings_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
Run Code Online (Sandbox Code Playgroud)

我认为这:

    settings.py
    settings_dev.py
    settings_production.py
Run Code Online (Sandbox Code Playgroud)

比这更好:

    settings/__init__.py
    settings/base.py
    settings/dev.py
    settings/production.py
Run Code Online (Sandbox Code Playgroud)

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


我通常把node_modules/bower_components/默认内的项目目录static/文件夹中.

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


Sac*_*han 8

根据 Django 项目骨架,可以遵循的正确目录结构是:

\n\n
[projectname]/                  <- project root\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 [projectname]/              <- Django root\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings/\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 common.py\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 development.py\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 i18n.py\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 production.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 urls.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wsgi.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apps/\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 configs/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apache2_vhost.sample\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 README\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 doc/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Makefile\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 source/\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 *snap*\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.rst\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 run/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 media/\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 README\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 static/\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 README\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 static/\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 README\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 templates/\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.html\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 core\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 login.html\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 README\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅https://django-project-sculpture.readthedocs.io/en/latest/struct.html了解最新的目录结构。

\n

  • 我讨厌 [项目名称]/[项目名称] 方法!) (23认同)
  • django-project-sculpture 不是“Django 文档”。更准确的说法是“根据 django-project-sculpture,...”。 (3认同)