2011-03-31 190 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