一尘不染

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

django

我知道实际上没有唯一正确的方法。但是,我发现很难创建一个可以正常工作并且对每个开发人员和管理员都保持整洁的目录结构。github上的大多数项目都有一些标准结构。但是它没有显示在PC上组织另一个文件和所有项目的方法。

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

  • 项目(你正在处理的所有项目)
  • 源文件(应用程序本身)
  • 存储库的工作副本(我使用git)
  • 虚拟环境(我更喜欢将其放置在项目附近)
  • 静态根(用于编译的静态文件)
  • 媒体根(用于上传的媒体文件)
  • 自述文件
  • 执照
  • 单据
  • 草图
  • 示例(使用该项目提供的应用程序的示例项目)
  • 数据库(如果使用sqlite)
  • 成功完成项目通常需要的其他任何东西
  • 我要解决的问题:
  • 目录的好名称,以便其目的明确。
  • 将所有项目文件(包括virtualenv)放在一个位置,这样我就可以轻松地复制,移动,归档,删除整个项目或估计磁盘空间使用情况。
  • 创建某些选定文件集的多个副本,例如整个应用程序,存储库或virtualenv,同时保留我不想克隆的另一个文件的单个副本。
  • 只需通过同步选定的一个目录,即可将正确的文件集部署到服务器。

阅读 1400

收藏
2020-03-26

共1个答案

一尘不染

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

  • Stand-alone websites
  • Pluggable applications

独立网站

通常是私人项目,但不一定必须如此。通常看起来像这样:

~/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.pyPATH,因此我可以manage.py直接(在任何地方)运行。

专案专用的应用程式

我曾经将这些应用程序放到project_name/apps/目录中,并使用相对导入方式将其导入。

模板/静态/语言环境/测试文件

我将这些模板和静态文件放在全局模板/静态目录中,而不是放在每个应用程序中。这些文件通常是由人们编辑的,他们根本不关心项目代码的结构或python。如果你是一个全职的开发人员,独自工作或以小组形式工作,则可以创建按应用程序模板/静态目录。这实际上只是一个品味问题。

尽管有时创建单独的语言环境目录比较方便,但对于语言环境也是如此。

通常最好将测试放置在每个应用程序中,但是通常有许多集成/功能测试可以测试更多的应用程序,因此全局测试目录确实有意义。

Tmp目录

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

虚拟环境

我更喜欢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

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

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

2020-03-26