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

我知道没有唯一正确的方法。然而,我发现很难为每个开发人员和管理员创建一个工作良好并保持干净的目录结构。在github上的大多数项目中都有一些标准的结构。但它没有显示一个方法来组织另一个文件和所有的项目在pc上。

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

  • 项目(你正在做的所有项目)
  • 源文件(应用程序本身)
  • 仓库的工作副本(我使用git)
  • 虚拟环境(我更喜欢把它放在项目附近)
  • 静态根目录(用于编译的静态文件)
  • 媒体根目录(用于上传的媒体文件)
  • 自述
  • 许可证
  • 文档
  • 草图
  • 示例(使用该项目提供的应用程序的示例项目)
  • 数据库(如果使用sqlite)
  • 你在一个项目上成功工作通常需要的其他东西

我想解决的问题是:

  • 目录的好名字,这样它们的目的就明确了。
  • 保持所有项目文件(包括virtualenv)在一个地方,所以我可以很容易地复制,移动,存档,删除整个项目或估计磁盘空间的使用情况。
  • 为一些选定的文件集(如整个应用程序、存储库或virtualenv)创建多个副本,同时保留另一个我不想克隆的文件的单个副本。
  • 通过对选定的一个目录进行rsync,将正确的文件集部署到服务器。
185972 次浏览

我的答案来自于我自己的工作经验,主要是在我强烈推荐的书两勺Django中,在那里你可以找到更详细的解释。我只回答其中的一些问题,欢迎大家的改进和纠正。但也可以有更多的正确的礼仪来达到同样的目的。

< p > 项目
在我的个人目录中有一个主文件夹,用来保存我正在进行的所有项目 < p > 源文件
我个人使用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
< p > 存储库
Git或Mercurial似乎是Django开发人员中最流行的版本控制系统。而最流行的备份托管服务GitHubBitbucket都.

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

pip freeze -l > requirements.txt

静态的根
项目文件夹< / p >

媒体根
项目文件夹< / p >

自述
存储库根

许可证
库根< / p >

文档
库根。这个python包可以帮助你更容易地维护你的文档

草图

例子

数据库

这是我在我的系统上遵循的。

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

  2. 个人项目:我遵循一个标准化结构模板被许多开发人员使用,称为django-skel用于个人项目。它基本上负责你所有的静态文件和媒体文件。

  3. 虚拟环境:我有一个virtualenvs文件夹在我的家存储系统中的所有虚拟环境,即~/virtualenvs。这给了我<强大的>灵活性,我知道我拥有的所有虚拟环境,可以轻松地查看和使用

以上3个分区是My工作环境的主要分区。

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

Django中有两种“项目”;我在~/projects/目录中拥有的,它们的结构略有不同。

  • 独立的网站
  • 可插入应用程序

独立的网站

大部分是私人项目,但也不一定。它通常是这样的:

~/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.py, development.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,并将所有venvs放入~/.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应用程序,它允许我运行单个管理命令来更新环境,但我只在一个项目中使用它,我仍在试验中。

草图和草稿

模板草案我放置在全局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
...

目录的名称是清楚的(我希望)。我把测试文件放在应用程序目录外, 但这真的不重要。提供READMEsetup.py是很重要的,所以包很容易通过pip安装

我不喜欢创建一个新的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/文件夹中。

根据Django Project Skeleton,正确的目录结构如下:

[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

你可以使用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