关闭。这个问题是基于意见的。它目前不接受答案。想改进这个问题?更新问题,以便可以通过编辑这篇文章用事实和引用来回答它。 9 个月前关闭。社区在 9 个月前审查了是否重新打开此问题并将其关闭:原始关闭原因未解决 改进此问题
我知道实际上没有唯一正确的方法。但是,我发现很难创建一个对每个开发人员和管理员都运行良好且保持干净的目录结构。 github 上的大多数项目都有一些标准结构。但它没有显示在 pc 上组织其他文件和所有项目的方法。
在开发机器上组织所有这些目录的最方便的方法是什么?您如何命名它们,以及如何将其连接并部署到服务器?
项目(您正在从事的所有项目)
源文件(应用程序本身)
存储库的工作副本(我使用 git)
虚拟环境(我更喜欢把它放在项目附近)
静态根(用于编译的静态文件)
媒体根(用于上传的媒体文件)
自述文件
执照
文件
草图
示例(使用本项目提供的应用程序的示例项目)
数据库(如果使用 sqlite)
成功完成项目通常需要的其他任何东西
我要解决的问题:
目录的好名称,以便其目的明确。
将所有项目文件(包括 virtualenv)保存在一个地方,这样我就可以轻松地复制、移动、存档、删除整个项目或估计磁盘空间使用情况。
创建某些选定文件集的多个副本,例如整个应用程序、存储库或 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
导入所有内容并仅覆盖必要的变量。
对于每个环境,都有单独的设置文件,例如。生产、开发。我还测试了一些项目(用于测试运行程序)、暂存(作为最终部署前的检查)和 heroku(用于部署到 heroku)设置。
要求
我宁愿直接在 setup.py 中指定要求。只有我在 requirements_dev.txt
中拥有的开发/测试环境所需的那些。
某些服务(例如 heroku)需要在根目录中有 requirements.txt
。
安装程序.py
使用 setuptools
部署项目时很有用。它将 manage.py
添加到 PATH
,因此我可以直接(在任何地方)运行 manage.py
。
项目特定的应用程序
我曾经将这些应用程序放入 project_name/apps/
目录并使用相对导入来导入它们。
模板/静态/语言环境/测试文件
我将这些模板和静态文件放入全局模板/静态目录中,而不是在每个应用程序中。这些文件通常由根本不关心项目代码结构或 python 的人编辑。如果您是单独工作或在小团队中工作的全栈开发人员,您可以创建每个应用程序的模板/静态目录。这真的只是口味问题。
这同样适用于语言环境,尽管有时创建单独的语言环境目录很方便。
测试通常最好放在每个应用程序中,但通常有许多集成/功能测试来测试更多应用程序一起工作,因此全局测试目录确实有意义。
临时目录
项目根目录中有临时目录,不包括在 VCS 中。它用于在开发过程中存储媒体/静态文件和 sqlite 数据库。 tmp 中的所有内容都可以随时删除,没有任何问题。
虚拟环境
我更喜欢 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
...
目录的名称很清楚(我希望如此)。我将测试文件放在 app 目录之外,但这并不重要。提供 README
和 setup.py
很重要,因此可以通过 pip
轻松安装软件包。
我的回答灵感来自我自己的工作经验,并且大部分都在我强烈推荐的书 Two Scoops of Django 中,您可以在其中找到对所有内容的更详细解释。我只是回答一些观点,欢迎任何改进或更正。但也可以有更正确的方式来达到同样的目的。
项目 我的个人目录中有一个主文件夹,用于维护我正在处理的所有项目。
源文件我个人使用 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
存储库
Git 或 Mercurial 似乎是 Django 开发人员中最流行的版本控制系统。以及最流行的备份托管服务 GitHub 和 Bitbucket。
虚拟环境我使用 virtualenv 和 virtualenvwrapper。安装第二个后,您需要设置工作目录。我的位于我的 /home/envs 目录中,正如 virtualenvwrapper 安装指南中推荐的那样。但我认为最重要的不是它放在哪里。使用虚拟环境时最重要的事情是保持 requirements.txt 文件是最新的。
pip freeze -l > requirements.txt
静态根项目文件夹
媒体根项目文件夹
README 存储库根目录
许可证存储库根
文档存储库根目录。这个 python 包可以帮助您更轻松地维护您的文档:
重构文本
狮身人面像
草图
例子
数据库
我不喜欢创建新的 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/
文件夹中。
根据 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。
这是我在我的系统上遵循的内容。
所有项目:我的主文件夹中有一个项目目录,即 ~/projects。所有的项目都在里面。个人项目:我遵循许多开发人员使用的标准化结构模板,称为 django-skel 用于个人项目。它基本上会处理您所有的静态文件和媒体文件等等。虚拟环境:我家中有一个 virtualenvs 文件夹,用于存储系统中的所有虚拟环境,即 ~/virtualenvs 。这给了我灵活性,我知道我拥有的所有虚拟环境,并且看起来很容易使用
以上3个是我的工作环境的主要分区。
您提到的所有其他部分主要取决于项目到项目的基础(即您可能对不同的项目使用不同的数据库)。因此,他们应该驻留在各自的项目中。
您可以使用 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
不定期副业成功案例分享
scripts
关键字参数:github.com/elvard/django-start-template/blob/master/project/… 我喜欢tmp
,因为它建议可以随时删除的“临时的东西”。顶层locale
目录不是必需的,您可以将它放在任何地方。我只是喜欢它与静态/模板目录一致。git checkout
或在克隆项目目录时仅排除一个目录“tmp”来存档。因此,您的结构似乎满足所有要求,并且毫无疑问可以定期使用。我接受你的回答。谢谢你。src
。这是源文件和 git 存储库根目录的工作副本。我可以制作这个目录的多个副本 -src
、src.bak
、src_tmp
等等。env
、tmp
、media
、backup
等其他非 repo 目录位于同一级别。所以我可以随时cp -r src src.bak
用 git 做一些实验或与外部工具比较版本。虽然您的存储库中有本地文件,但我的本地文件目录中有存储库(反之亦然)。我的src
目录的更好名称是repo
。