Django项目层级/组织

Django项目层级/组织,django,hierarchy,Django,Hierarchy,我是Django的新手,刚开始一个项目,我希望用正确的方式来做 我想知道你认为组织项目的最佳实践是什么 以下是我的一些问题: 如何将静态资源从Python代码中分离出来,以避免浪费时间通过Django处理静态内容 由于应用程序是可重用的模块,它们与项目的关系并不紧密,所以它们应该位于项目目录中,还是位于包含我所有“自制”应用程序的另一个目录中 模板是静态内容还是动态内容 以下是我当前的文件层次结构: webapps/ myproject/ apache/

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


谢谢

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

回答您的问题:

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

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

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


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

以下内容仅适用于django 1.3。

应用程序
目录中:

...
app1/
    static/
        app1/
    templates/
        app1/
    models.py
    ...
    views.py
如果使用新应用程序,您的设置可能如下所示:

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',
)
同样,您的模板可以直接从安装的应用程序加载:

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\u static/
,您可以将web服务器指向该目录以提供静态内容

对于预打包的库,使用virtualenv和pip是一个好主意。否则,我喜欢将库保存在项目根目录中的
lib
目录中。它使引用源代码、模板和静态内容变得非常方便,而不是安装到
网站包
(特别是在不使用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/

我的设计师不想到处(在python路径上)寻找模板文件。我的模板布局与你的模板布局相同,只有一个模板文件夹,所有应用程序都位于该文件夹下方。每个应用程序都有自己的base.html,它扩展了basebase.html

最近,我开始使用pinax模式的应用程序文件夹,所有应用程序都放在那里。这纯粹是出于美学考虑,因为它向我展示了一棵树,我的所有应用程序都聚集在树的这一部分。我不喜欢的是一个按照模板、媒体或站点媒体的字母顺序排列的应用程序。树上下滚动使我慢了下来。通过将所有应用程序放在树中的一个位置,
git commit-m“featurenotes”应用程序
在代码中签入也会发生变化,这是另一个优点

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
webapps/
米维登夫/
垃圾箱/
解放党/

myproject/与原始问题有些无关,但与使用“/static/”存储静态资源有关。。。我在Amazon Web服务上的Bitnami Django VM上部署了一个Django应用程序,所有客户端对我的静态资源的请求都返回404 not found。我最终跟踪到了django.conf文件,该文件包含以下别名:alias/static“xxx/python2.7/site packages/django/contrib/admin/static”,因此对“/static/xyz”的所有请求都被化名到了另一个位置并失败。我只是想注意一下,以防有人遇到同样的问题。这看起来我可以从我正在做的事情中成长,但我会继续将
myvirtenv
(我只是在
myproject
中键入
venv
)。非常适合克隆,但是使用startproject需要我使用不同(类似)的virtualenv创建项目,然后进入项目并设置我的virtualenv。我只是忽略了源代码管理中的
venv