我在~/projects/
目录中有两种不同结构的Django“项目”:
独立网站
大多数是私人项目,但不一定。它通常是这样的:
~/projects/project_name/
docs/
scripts/
manage.py
project_name/
apps/
accounts/
__init__.py
...
settings/
__init__.py
production.py
development.py
...
__init__.py
urls.py
wsgi.py
static/
templates/
tests/
tmp/
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.py
添加到PATH
中,因此我可以直接运行manage.py
(任何地方)。
特定于项目的应用程序
我曾经将这些应用程序放入project_name/apps/
目录中,并使用相对导入进行导入。
模板/静态/本地化/测试文件
我将这些模板和静态文件放入全局模板/静态目录中,而不是每个应用程序内部。通常由人编辑这些文件,他们不关心项目代码结构或python等内容。如果您是独自工作或小团队的全栈开发人员,则可以创建每个应用程序独立的模板/静态目录。这只是一种口味问题。
对于本地化,同样适用,尽管有时创建单独的本地化目录很方便。
测试通常最好放在每个应用程序内部,但通常有许多集成/功能测试测试更多应用程序共同工作,因此全局测试目录确实有意义。
临时目录
在项目根目录中有一个临时目录,被排除在版本控制之外。它用于在开发过程中存储媒体/静态文件和sqlite数据库。可以随时删除tmp中的所有内容而不会出现问题。
Virtualenv
我更喜欢virtualenvwrapper
并将所有虚拟环境放置在~/.venvs
目录中,但您可以将其放置在tmp/
中以保持一致。
项目模板
我为此设置创建了项目模板:django-start-template
部署
该项目的部署如下:
source $VENV/bin/activate
export DJANGO_SETTINGS_MODULE=project_name.settings.production
git pull
pip install -r requirements.txt
manage.py syncdb --noinput
manage.py migrate
manage.py collectstatic --noinput
manage.py makemessages -a
manage.py compilemessages
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
...
目录的名称应该很清晰(我希望如此)。我将测试文件放在应用程序目录之外,但实际上这并不重要。重要的是提供README
和setup.py
,这样包就可以通过pip
轻松安装。
setup.py
将manage.py
安装到虚拟环境的路径下,因此当您运行它时,它将不再在scripts
目录中。2)模块{{ project_name }}.settings.production
使用绝对路径指定,只要您的项目能够在Python路径中访问,它就会找到它。 - Tomáš Ehrlich