2011-03-31 158 views
6

我是Django的新手,开始一个项目,我想以正确的方式做到这一点。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/ 

你觉得呢? 什么会更好?

谢谢!

回答

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/ 
+0

与原始问题有点无关,但与使用“/ static /”来存储静态资源有关......我在亚马逊网络服务部署了一个Django应用程序到Bitnami Django VM,并且所有客户端请求静态资源正在返回404未找到。我最终将其追踪到包含以下别名的django.conf文件中: Alias/static“xxx/python2.7/site-packages/django/contrib/admin/static” 因此,所有对“/ static/xyz “被别人带到别的地方失败了。只是想要注意到这一点,以防有人遇到同样的问题。 – jarmod 2013-02-18 18:44:24

0

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

回答您的问题:

  • 分离静态和动态:这是在你的Web服务器配置的级别进行。在你的情况下,你的apache虚拟主机conf需要有一个webapps /静态目录的入口,但不能用于其他任何东西。 The documentation就是一个很好的例子。

  • 如果应用程序确实与您的项目完全分离,那么只要将它们放到Pythonpath中,它们就可以活在它之外。一种好的方法是将它们保存在不同的代码库中,并使用pip和virtualenv将它们安装到您的项目中。但是,我认为你会发现很多应用程序都是特定于项目的,所以应该放在项目目录中。

  • 模板是非常明确的动态内容。如果你直接用Apache提供它们,它们将不会被解析,所以你的用户会看到变量和块代码的代码而不是值。

3

我的设计师并不想去打猎到处(遍布蟒蛇路径)模板文件。我的模板布局遵循你的要求,因为有一个模板文件夹,所有的应用程序都在下面。每个应用都有自己的base.html,它扩展了basebase.html。

这里最近我已经开始关注应用程序文件夹的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克隆URL
  3. PIP安装-r要求\ base.txt -r要求\项目。TXT
  4. 管理执行syncdb(如果使用SQLite,否则你必须首先做的DB创建任务)从/ etc/apache2的
  5. 重装Apache的配置
  6. 利润
  7. 符号链接!
+0

这看起来像我可以从我正在做的事情中成长起来,但我会继续在'myproject'里面推'myvirtenv'(我只是输入'venv')。非常适合克隆,但使用startproject需要我使用不同的(类似的)virtualenv创建项目,然后进入项目并设置我的virtualenv。我只是忽略来自源代码控制的'venv'。 – sage 2013-12-25 02:06:40