【问题标题】:Django project hierarchy/organizationDjango项目层次结构/组织
【发布时间】:2011-03-31 20:30:12
【问题描述】:

我是 Django 新手并开始了一个项目,我希望以正确的方式去做。

我想知道您认为组织项目的最佳实践。

以下是我的一些问题:

  • 如何将静态资源与 Python 代码分开,以免浪费时间通过 Django 处理静态内容?
  • 由于应用程序是可重用的模块,它们对项目来说并不是很紧密,所以它们应该位于项目目录中,还是位于包含我所有“自制”应用程序的另一个目录中?
  • 模板是静态内容还是动态内容?

这是我当前的文件层次结构:

webapps/
    myproject/
        apache/
        bin/
        lib/
        templates/
            app1/
            app2/
        src/
            app1/
            app2/
            __init.py
            settings.py
            urls.py
            manage.py
        myproject.wsgi
    admin/
    static/
        css/
        img/

你怎么看? 什么会更好?

谢谢!

【问题讨论】:

    标签: django hierarchy


    【解决方案1】:

    您的目录结构也可能取决于您使用的 django 版本。如果您使用的是 django 1.3,则处理静态内容略有变化。您的模板也可以单独排列。

    以下仅适用于 django 1.3。

    app 目录中:

    ...
    app1/
        static/
            app1/
        templates/
            app1/
        models.py
        ...
        views.py
    

    如果您使用新的django.contrib.staticfiles 应用程序,您的设置可能如下所示:

    MEDIA_ROOT = path.join(ROOT_PATH,'uploaded_media/')
    MEDIA_URL = '/uploaded_media/'
    # static content is collected here, and served from here, but don't add stuff manually here! add to staticfiles_dirs
    STATIC_ROOT = path.join(ROOT_PATH, 'collected_static/')
    ADMIN_MEDIA_PREFIX = '/static/admin/'
    STATIC_URL = '/static/'
    # Additional locations of static files
    STATICFILES_DIRS = (
        path.join(ROOT_PATH, 'src/extra_static/'),
    )
    
    STATICFILES_FINDERS = (
        'django.contrib.staticfiles.finders.FileSystemFinder',
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    )
    

    同样,您的模板可以直接从INSTALLED_APP 加载:

    TEMPLATE_LOADERS = (
        'django.template.loaders.filesystem.Loader',
        'django.template.loaders.app_directories.Loader'
    )
    
    TEMPLATE_DIRS = (
        path.join(ROOT_PATH,'src/templates/'),
    )
    

    上述两种策略意​​味着模板和静态内容可以存在于其特定的应用目录中。在开发中,使用contrib.staticfiles,可以直接从您的应用程序文件夹中提供静态内容。在生产中,有一个管理命令将所有应用目录静态内容收集到/path/to/project/collected_static/,您可以将您的网络服务器指向该目录以提供静态内容。

    对于预打包的库,使用 virtualenv 和 pip 是个好主意。否则,我喜欢将库保存在项目根目录中的 lib 目录中。它使得引用源代码、模板和静态内容非常方便,而不是安装到 site-packages(尤其是在不使用 virtualenv 时)。

    所以,重新安排你的项目结构:

    webapps/
        myproject/
            apache/
            bin/
            lib/
            collected_static/
            uploaded_media/
            myproject.wsgi
            src/
                templates/ # lib template overrides and site wide templates
                    base.html
                    lib_1/
                        nav.html
                extra_static/
                    lib_1/ # libs that dont support django 1.3 static
                        js/
                        css/
                settings.py
                settingslocal.py # keep developer specific settings here
                urls.py
                manage.py
                app1/
                    __init.py
                    static/
                        app1/
                            js/
                            css/
                    templates/
                        app1/
    

    【讨论】:

    • 与原始问题有些无关,但与使用“/static/”来存储您的静态资源有关......我将一个 Django 应用程序部署到 Amazon Web Services 和所有客户端上的 Bitnami Django VM对我的静态资源的请求返回 404 not found。我最终将其追溯到 django.conf 文件,其中包含以下别名: Alias /static "xxx/python2.7/site-packages/django/contrib/admin/static" 所以所有对 "/static/xyz" 的请求都被别名了离开另一个位置并失败了。只是想注意这一点,以防有人遇到同样的问题。
    【解决方案2】:

    我的设计师不想到处寻找模板文件(在 python 路径中)。我的模板布局遵循你的,因为有一个模板文件夹,所有的应用程序都在它下面。每个应用程序都有自己的 base.html 扩展 basebase.html。

    最近我开始关注应用程序文件夹的 pinax 模型,所有应用程序都在其中。这样做的原因纯粹是美学,因为Wing 向我展示了一棵树,我所有的应用程序都聚集在树的那个部分。我不喜欢的是在模板或媒体或 site_media 之后按字母顺序排序的应用程序。在树上上下滚动让我放慢了速度。通过将所有应用程序放在树中的一个位置,代码中的git commit -m "feature notes" apps checkins 也会发生变化,这是另一个优势。

    webapps/
      myvirtenv/
        bin/
        lib/
        myproject/        <- Source control starts here
          site_media/
            collected_static/
              js/
              css/
              img/
            uploaded_media/
          deploy/
              myproject.wsgi
              procmail scripts
              apache site files  # linked from /etc/apache2/sites-endabled
          apps/
            app1/
              templates/       <- This should be here, but in practice I just leave in templates below
                app1/
            app2/
          templates/ # lib template overrides and site wide templates
            basebase.html      <- I changed the name to help my designer
            app1/
            app2/
          settings.py
          gethostname()_local_settings.py # keep machine specific settings here
          urls.py
          manage.py
          requirements
            base.txt
            project.txt
    

    base.html 文件太多,谈论起来很困难,因此 basebase.html 诞生了,从那以后我们一直对此感到满意。

    我没有任何不能与 staticfiles 应用程序一起使用的静态文件。我在 1.2 中使用该应用程序。我还没有回去完成 1.3 静态文件夹,但随着事情的进展,我可能会在接下来的几个月内完成。

    我从 pinax 获得了需求文件夹技巧。

    1. 创建 VirtualENV
    2. git 克隆网址
    3. pip install -r requirements\base.txt -r requirements\project.txt
    4. 管理syncdb(如果使用sqlite,否则必须先做db创建任务)
    5. 来自 /etc/apache2 的符号链接
    6. 重新加载 apache 配置
    7. 利润!

    【讨论】:

    • 这看起来像我可以从我正在做的事情中成长,但我会继续推myvirtenv(我只是输入venv)在myproject中。非常适合克隆,但是使用 startproject 需要我使用不同的(类似的)virtualenv 创建项目,然后进入项目并设置我的 virtualenv。我只是从源代码控制中忽略 venv
    【解决方案3】:

    你在这里有一些好的想法。我的第一反应是问那个管理目录在做什么? admin 是 Django 的一部分,不需要单独的模块 - 特定于应用程序的 admin.py 文件需要存在于各自的应用程序中。

    回答您的问题:

    • 分离静态和动态:这是在您的 Web 服务器配置级别完成的。在您的情况下,您的 apache virtualhost conf 需要有一个 webapps/static 目录的条目,而不是其他任何东西。 The documentation 有一个很好的例子。

    • 如果应用程序真的与您的项目完全解耦,那么是的,只要您将它们放到 Pythonpath 上,它们就可以存在于项目之外。一种好方法是将它们保存在单独的代码存储库中,并使用 pip 和 virtualenv 将它们安装到您的项目中。但是,我认为您会发现您的许多应用程序都是特定于项目的,因此位于您的项目目录中。

    • 模板绝对是动态内容。如果您直接使用 Apache 为它们提供服务,它们将不会被解析,因此您的用户将看到变量和块代码的代码,而不是值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2021-10-09
      • 2011-04-23
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多