【问题标题】:Best practice for Django project working directory structure [closed]Django项目工作目录结构的最佳实践[关闭]
【发布时间】:2014-05-15 12:36:44
【问题描述】:

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

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

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

我要解决的问题:

  • 目录名称好,目的明确。
  • 将所有项目文件(包括 virtualenv)保存在一个位置,以便我可以轻松复制、移动、归档、删除整个项目或估计磁盘空间使用情况。
  • 创建某些选定文件集的多个副本,例如整个应用程序、存储库或 virtualenv,同时保留另一个我不想克隆的文件的单个副本。
  • 只需通过 rsync 选定的一个目录即可将一组正确的文件部署到服务器。

【问题讨论】:

    标签: django directory-structure organization project-structure


    【解决方案1】:

    在我的~/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

    setup.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
    ...
    

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

    【讨论】:

    • 谢谢!我喜欢你的结构。它给了我有用的想法。关于使用 setup.py 满足要求并将 manage.py 安装到 PATH 中的要点。你能告诉你最后一件事是怎么做的吗?关于“tmp”目录也很好。我宁愿将它命名为“本地”,然后我可能有“env”、“tmp”以及里面的任何东西。这解决了与 gitignore 有太多交易的问题。一个新问题是这个名字太接近'locale'。也许将“语言环境”移动到核心应用程序“project_name”是有意义的,不确定。只是不想因为名字不好而改变结构。有什么建议吗?
    • 使用 setup.py 时,添加scripts 关键字参数:github.com/elvard/django-start-template/blob/master/project/… 我喜欢tmp,因为它建议“临时的东西”,可以随时删除。顶层locale 目录不是必需的,您可以将它放在任何地方。我只是喜欢它与静态/模板目录保持一致。
    • 我对能够在不复制其他文件的情况下制作多个源文件副本的要求没有直接解决。但是目标仍然可以通过使用git checkout 或在克隆项目目录时仅排除一个目录“tmp”来存档。因此,您的结构似乎满足所有要求,并且毫无疑问可以定期使用。我接受你的回答。谢谢。
    • 谢谢。我仍然不明白您所说的“能够在不复制另一个文件的情况下制作多个源文件副本”是什么意思。调整 rsync 命令可以,但这可能不是您的意思...
    • 我通常在项目根目录内创建目录src。这是源文件和 git 存储库根目录的工作副本。我可以制作这个目录的多个副本——srcsrc.baksrc_tmp 等等。其他非 repo 目录,如 envtmpmediabackup 位于同一级别。所以我可以随时cp -r src src.bak 用 git 做一些实验或与外部工具比较版本。虽然您的存储库中有本地文件,但我的本地文件目录中有存储库(反之亦然)。我的src 目录的更好名称是repo
    【解决方案2】:

    我的回答灵感来自我自己的工作经验,主要是在我强烈推荐的书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 开发人员中最流行的版本控制系统。还有最流行的备份托管服务GitHubBitbucket

    虚拟环境
    我使用 virtualenv 和 virtualenvwrapper。安装第二个后,您需要设置工作目录。我的位于我的 /home/envs 目录中,正如 virtualenvwrapper 安装指南中推荐的那样。但我认为最重要的不是它放在哪里。使用虚拟环境时最重要的是保持 requirements.txt 文件是最新的。

    pip freeze -l > requirements.txt 
    

    静态根
    项目文件夹

    媒体根
    项目文件夹

    自述文件
    存储库根目录

    许可证
    仓库根目录

    文档
    存储库根。这个 python 包可以帮助您更轻松地维护您的文档:

    草图

    示例

    数据库

    【讨论】:

    • 感谢您分享您的经验。您的结构中有很多“项目*”目录。你可能不会在现实生活中使用这样的名字,对吧?假设我们有一个“待办事项”项目。在这种情况下,您如何命名这些目录?我在您当前的结构中看到的问题是将存储库与非存储库文件混合(如上所述)。向 .gitignore 添加任何垃圾可能很烦人,不是吗?另一个可疑的事情是让 env 目录远离项目本身。是否有意义?为什么不创建~/docs、~/statics 等等?甚至 git 也喜欢坐在源文件附近。
    • 我将它们命名为:“todo_project” -> todo -> todo(或者可能是 todoapp)。我认为将存储库文件夹放在目录层次结构的根目录中很重要。但是,这只是我的看法。关于环境目录,当您需要设置生产环境时,您只需键入:pip install -U -r requirements.txt。但是,正如我所说,没有一个解决方案可以解决所有问题。
    • 所以主应用的路径是“projects/todo_project/todo/todo”。单词“projects”重复了两次,单词“todo”重复了三遍。这看起来像“项目/项目/my_project/project_dir/project/project”。名字非常不清楚。这是我试图在我的目录结构中解决的主要问题之一。我想命名目录以便于理解层次结构。存储库根目录呢,您能解释一下为什么它很重要吗?你能否解释一下将环境保持在主项目目录之外有什么好处?
    【解决方案3】:

    我不喜欢创建新的settings/ 目录。我只需添加名为settings_dev.pysettings_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/ 文件夹中。

    【讨论】:

      【解决方案4】:

      这是我在我的系统上关注的内容。

      1. 所有项目:在我的主文件夹中有一个项目目录,即~/projects。所有的项目都在里面。

      2. 个人项目:我遵循许多开发人员使用的标准化结构模板,称为django-skel 用于个人项目。它基本上会处理您所有的静态文件和媒体文件。

      3. 虚拟环境:我家中有一个virtualenvs 文件夹,用于存储系统中的所有虚拟环境,即~/virtualenvs。这给了我灵活性,我知道我拥有哪些虚拟环境并且看起来很容易使用

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

      您提到的所有其他部分主要取决于项目到项目的基础(即您可能为不同的项目使用不同的数据库)。所以他们应该驻留在各自的项目中。

      【讨论】:

      • 谢谢。将存储库与非存储库文件混合时,将任何垃圾添加到 .gitignore 可能会很烦人。是不是?我的一些项目有多达十个或更多这样的文件和目录,所以这对我来说是个真正的问题。另一个可疑的事情是让 env 目录远离项目本身。这种解决方案的灵活性是什么?为什么不创建~/docs、~/statics 等等?甚至 git 也喜欢坐在源文件附近。我认为灵活性是我可以复制/移动/归档/删除整个项目目录,包括 virtualenv,并且可以轻松地在一个项目中维护多个 env
      【解决方案5】:

      根据 Django 项目骨架,可以遵循的正确目录结构是:

      [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 了解最新的目录结构。

      【讨论】:

      • 我讨厌 [projectname]/[projectname] 方法!)
      • django-project-skeleton 不是“Django 文档”。说“根据 django-project-skeleton,...”会更准确。
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 2016-06-18
        • 2023-02-05
        • 2014-06-26
        • 2010-10-04
        相关资源
        最近更新 更多