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.py
, development.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目录之外,但是真的没关系。 提供README
和setup.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.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
我认为这:
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/
文件夹。
这是我在我的系统上遵循的。
-
所有项目 : 我的家庭文件夹中有一个项目目录,即
~/projects
。 所有的项目都在里面。 -
个人项目 :我遵循由许多开发人员使用的标准化结构模板 ,称为django-skel,用于个别项目。 它基本上照顾所有的静态文件和媒体文件和所有。
-
虚拟环境 : 我家里有一个virtualenvs文件夹,用于存储系统中的所有虚拟环境,例如
~/virtualenvs
。 这给了我灵活性 ,我知道我所有的虚拟环境,并可以很容易地使用
以上3个是我工作环境的主要分区。
你提到的所有其他部分大多依赖于项目到项目的基础 (即你可能使用不同的数据库为不同的项目)。 所以他们应该居住在他们的个人项目中。