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

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

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

  • 项目(您正在处理的所有项目)
  • 源文件(应用程序本身)
  • 存储库的工作副本(我使用git)
  • 虚拟环境(我更喜欢把它放在项目附近)
  • 静态根目录(用于已编译的静态文件)
  • 媒体根目录(用于上载的媒体文件)
  • 自述
  • 许可证
  • 文件
  • 草图
  • 示例(使用此项目提供的应用程序的示例项目)
  • 数据库(如果使用sqlite)
  • 你们通常需要的任何其他东西来成功地完成这个项目

我想解决的问题是:

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

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

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

独立网站

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

~/projects/project\u name/
文件/文档
剧本/
manage.py#通过setup.py安装到PATH
project_name/#project dir(django-admin.py创建的一个)
应用程序/#特定于项目的应用程序
accounts/#最常用的应用程序,具有自定义用户模型
__初始值
...
设置/不同环境的设置,见下文
__初始值
production.py
开发.py
...
__init__.py包含项目版本
url.py
wsgi.py
静态/#特定于站点的静态文件
模板/现场特定模板
测试/#特定于现场的测试(主要是浏览器测试)
tmp/#不包括在git中
setup.py
requirements.txt
需求_dev.txt
pytest.ini
...

背景

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

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

要求

我宁愿直接在setup.py中指定需求。仅适用于
我在需求\u dev.txt中拥有的开发/测试环境

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

setup.py

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

特定于项目的应用程序

我曾经将这些应用程序放入project\u name/apps/目录并导入它们
使用相对导入

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

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

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

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

Tmp目录

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

虚拟的

我更喜欢virtualenvwrapper并将所有的虚拟虚拟机放入~/.venvs目录,
但是您可以将它放在tmp/中以将其保持在一起

项目模板

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

部署

该项目的部署如下:

来源$VENV/bin/activate
导出DJANGO\u设置\u模块=项目名称.SETTINGS.production
吉特拉力
pip安装-r requirements.txt
#更新数据库、静态文件、区域设置
manage.py syncdb--noinput
manage.py迁移
manage.py collectstatic--noinput
manage.py makemessages-a
manage.py编译消息
#重新启动wsgi
触摸项目名称/wsgi.py

您可以使用rsync而不是git,但仍然需要运行批处理命令来更新您的环境

最近,我制作了django-deployapp,它允许我运行单个管理命令来更新环境,但我只在一个项目中使用过它,我仍在试用它

草图和草稿

我将模板草稿放在全局templates/目录中。我想人们可以在projectroot中创建文件夹sketchs/,但还没有使用它

可插拔应用程序

这些应用程序通常准备以开源的形式发布。我举了个例子
以下来自django forme

~/projects/django应用程序/
文件/
应用程序/
测验/
项目实例/
许可证
舱单
自述文件
setup.py
pytest.ini
伊氏弓形虫
特拉维斯·伊梅尔先生
...

目录的名称很清楚(我希望如此)。我将测试文件放在应用程序目录之外,
但这真的没关系。提供READMEsetup.py是很重要的,这样就可以通过pip轻松安装软件包

发表评论