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

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

项目(你正在做的所有项目) 源文件(应用程序本身) 仓库的工作副本(我使用git) 虚拟环境(我更喜欢把它放在项目附近) 静态根目录(用于编译的静态文件) 媒体根目录(用于上传的媒体文件) 自述 许可证 文档 草图 示例(使用该项目提供的应用程序的示例项目) 数据库(如果使用sqlite) 你在一个项目上成功工作通常需要的其他东西

我想解决的问题是:

目录的好名字,这样它们的目的就明确了。 保持所有项目文件(包括virtualenv)在一个地方,所以我可以很容易地复制,移动,存档,删除整个项目或估计磁盘空间的使用情况。 为一些选定的文件集(如整个应用程序、存储库或virtualenv)创建多个副本,同时保留另一个我不想克隆的文件的单个副本。 通过对选定的一个目录进行rsync,将正确的文件集部署到服务器。


当前回答

根据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获取最新的目录结构。

其他回答

根据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获取最新的目录结构。

我不喜欢创建一个新的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/放在默认的静态/文件夹的项目目录中。

有时候Git子模块有一个vendor/目录,但通常我把它们放在静态/文件夹中。

在我的~/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中指定需求。只需要这些 我在requients_dev .txt中有开发/测试环境。

一些服务(如;Heroku)要求根目录下有requirements.txt。

setup . py

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

具体项目的应用

我曾经把这些应用程序放入project_name/apps/目录并导入它们 使用相对导入。

模板/静态/地区/测试文件

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

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

测试通常最好放在每个应用程序中,但通常有很多测试 集成/功能测试,测试更多的应用程序一起工作,所以是全局的 测试目录有意义。

Tmp目录

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

Virtualenv

我更喜欢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应用程序,它允许我运行一个管理命令来更新环境,但我只在一个项目中使用它,我还在试验中。

草图和草稿

模板的草稿我放在全局模板/目录。我猜一个人可以创建文件夹草图/在项目根,但还没有使用它。

可插入应用程序

这些应用程序通常以开源的形式发布。我举了个例子 下面摘自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轻松安装包。

这是我在我的系统上遵循的。

All Projects: There is a projects directory in my home folder i.e. ~/projects. All the projects rest inside it. Individual Project: I follow a standardized structure template used by many developers called django-skel for individual projects. It basically takes care of all your static file and media files and all. Virtual environment: I have a virtualenvs folder inside my home to store all virtual environments in the system i.e. ~/virtualenvs . This gives me flexibility that I know what all virtual environments I have and can look use easily

以上3个分区是My工作环境的主要分区。

你提到的所有其他部分主要依赖于项目对项目的基础(即你可能会为不同的项目使用不同的数据库)。所以它们应该存在于各自的项目中。

我的答案来自于我自己的工作经验,主要是在我强烈推荐的《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 

静态的根 项目文件夹

媒体根 项目文件夹

自述 库根

许可证 库根

文档 库根。这些python包可以帮助你更容易地维护你的文档:

reStructuredText 斯芬克斯

草图

例子

数据库