Django项目层次/组织

时间:2011-03-31 20:30:13

标签: django hierarchy

我是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/
你怎么看? 什么会更好?

谢谢!

3 个答案:

答案 0 :(得分:5)

您的目录结构还可能取决于您正在使用的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/,您可以将Web服务器指向该目录以提供静态内容。

对于预先打包的库,使用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/

答案 1 :(得分:3)

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

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

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 clone url
  3. pip install -r requirements \ base.txt -r requirements \ project.txt
  4. 管理syncdb(如果使用sqlite,否则必须先执行数据库创建任务)
  5. 来自/ etc / apache2的
  6. 符号链接
  7. reload apache config
  8. 利润!

答案 2 :(得分:0)

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

回答你的问题:

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

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

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