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

我知道实际上没有单一的正确方法。 不过,我发现很难创build一个适用于每个开发人员和pipe理员的清晰的目录结构。 Github上的大多数项目都有一些标准的结构。 但它并没有显示出一种方式来组织其他文件和所有项目在PC上。

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

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

我想解决的问题是:

  • 好名字的目录,使他们的目的是明确的。
  • 保持所有的项目文件(包括virtualenv)在一个地方,所以我可以很容易地复制,移动,归档,删除整个项目或估计磁盘空间的使用情况。
  • 创build一些选定的文件集的多个副本,如整个应用程序,存储库或virtualenv,同时保留我不想克隆的另一个文件的单一副本。
  • 只需通过rsyncing选定的一个目录来将正确的一组文件部署到服务器。

我在~/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所有内容并仅覆盖必要的variables。

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

要求

我宁愿直接在setup.py中指定需求。 只有在requirements_dev.txt有开发/testing环境requirements_dev.txt

有些服务(例如heroku)需要在根目录下有requirements.txt文件。

setup.py

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

项目特定的应用程序

我曾经把这些应用程序放入project_name/apps/目录,并使用相对导入来导入它们。

模板/静态/语言环境/testing文件

我把这些模板和静态文件放到全局模板/静态目录中,而不是放在每个应用程序中。 这些文件通常由人们编辑,他们根本不关心项目代码结构或python。 如果您是独立工作或者小团队的全栈开发人员,则可以创build每个应用程序模板/静态目录。 这只是一个品味问题。

同样适用于语言环境,虽然有时候创build单独的语言环境目录很方便。

testing通常更好地放置在每个应用程序内,但通常有许多集成/functiontestingtesting更多的应用程序一起工作,所以全球testing目录确实是有道理的。

Tmp目录

项目根目录中有一个临时目录,从VCS中排除。 它用于在开发过程中存储媒体/静态文件和sqlite数据库。 tmp中的所有东西都可以随时删除而不会有任何问题。

VIRTUALENV

我更喜欢virtualenvwrapper并把所有的venvs放到~/.venvs目录下,但是你可以把它放在tmp/里面。

项目模板

我为这个设置创build了项目模板, 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]应用程序,它允许我运行单一的pipe理命令来更新环境,但是我只用了一个项目,而且我还在试验它。

草图和草稿

我放置在全局templates/目录中的模板草稿。 我想可以创build文件夹sketches/在项目的根,但还没有使用它。

可插入的应用程序

这些应用程序通常准备发布为开源。 我从django-forme下面的例子

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

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

我的回答是以我自己的工作经验为灵感,主要是在我强烈推荐的“Django Two Scoops ”一书中,以及在哪里可以find更详细的解释。 我只是回答一些问题,任何改进或更正都会受到欢迎。 但是为了达到同样的目的,也可以有更多正确的方法。

项目
我在我的个人目录中有一个主文件夹,在那里我维护了所有正在工作的项目。

源文件
我个人使用django项目根作为我的项目的存储库的根。 但在书中build议分开这两个东西。 我认为这是一个更好的方法,所以我希望能够逐步在我的项目上做出改变。

 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开发人员中最stream行的版本控制系统。 还有备份GitHub和Bitbucket最受欢迎的托pipe服务。

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

 pip freeze -l > requirements.txt 

静态根
项目文件夹

媒体根
项目文件夹

读我
存储库的根

执照
存储库的根

文件
存储库的根。 这个python包可以帮助您更轻松地维护您的文档:

  • reStructuredText的
  • 狮身人面像

草图

例子

数据库

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

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

  1. 所有项目我的家庭文件夹中有一个项目目录,~/projects 。 所有的项目都在里面。

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

  3. 虚拟环境我家里有一个virtualenvs文件夹,用于存储系统中的所有虚拟环境,例如~/virtualenvs 。 这给了我灵活性 ,我知道我所有的虚拟环境,并可以很容易地使用

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

你提到的所有其他部分大多依赖于项目到项目的基础 (即你可能使用不同的数据库为不同的项目)。 所以他们应该居住在他们的个人项目中。