2010-04-19 66 views
25

我正在開發一個基於網絡的大學門戶,該門戶將基於Django。我們仍處於探索階段,我正在努力尋找將項目/開發環境的最佳方式。大型Django應用程序佈局

我最初的想法是將系統開發爲一個Django「應用程序」,它包含用於分離出系統不同部分的子應用程序。我打算製作這些「子」應用程序的原因是,他們不會在父應用程序之外使用任何其他應用程序,因此分開分發這些應用程序幾乎沒有意義。我們預計該門戶將安裝在多個位置(例如,在不同的大學),因此主應用程序可以放入多個Django項目中進行安裝。因此,我們爲每個位置的項目都有一個不同的存儲庫,它實際上只是定義安裝的門戶網站應用程序的settings.py文件,以及將url定位到它的urls.py

雖然我已經開始編寫一些初始代碼,但我遇到了一個問題。一些處理用戶身份驗證和配置文件的代碼似乎沒有家。它在概念上並不屬於門戶應用程序,因爲它與門戶的功能無關。但是,它也不能進入項目存儲庫 - 因爲我會在每個位置的存儲庫中複製代碼。例如,如果我在此代碼中發現了一個錯誤,那麼我將不得不手動複製該位置的所有項目文件中的修復程序。

我的解決辦法是讓所有項目都重新分配一個「主」位置項目的分支,以便我可以從該主分區中提取任何更改。我認爲這很麻煩,而且這意味着我有一個更多的資源庫來照顧。

我正在尋找更好的方法來實現這個項目。任何人都可以推薦一個解決方案或類似的例子,我可以看看?問題似乎是我正在開發一個Django 項目而不只是一個Django 應用程序

+0

正如我在@ Jack的回答中所提到的那樣:我正在開發基本上是Django *項目*,而不僅僅是一個Django *應用程序*。因此,我需要在一個存儲庫中組織我的項目,並使用諸如local_settings.py技巧之類的東西來改變諸如安裝應用程序的不同站點的站點標題之類的內容。 – 2010-04-20 18:28:12

+0

(有點晚了,但...)除非你使用了很多非常Django特定的東西(管理員,第三方應用程序等),否則我會堅持使用更低層次的東西,比如Flask。這樣你可以完全控制你做事的方式。我剛剛將Django傾倒在我正在開發的一個更大的項目中。我所做的每件事都必須在問題出現問題後,完全按照Django的方式完成。 – orokusaki 2010-09-20 19:52:05

回答

32

我發現最好的方法是創建應用程序,然後將項目粘合在一起。我的大多數項目都包含類似的應用程序。電子郵件,筆記,行動的提示信息,用戶身份驗證,等我首選的佈局就像這樣:

  • 項目/
    • settings.py
    • urls.py
    • views.py
    • ...
  • 應用/
    • 電子郵件/
      • urls.py
      • views.py
      • ...
    • 筆記/
      • urls.py
      • views.py
      • 。 ..
    • ...

應用:

每一個 「應用程序」 的自成一體,和其他比settings.py,不依賴於項目本身(儘管它可以依靠其他應用程序)。其中一個應用程序是用戶驗證和管理。它具有完成apps/auth/urls.py中的任務的所有URL。所有的模板都在apps/auth/templates/auth/。它的所有功能都是獨立的,所以當我需要調整某些東西時,我知道該去哪裏。

項目:

project/包含了所有將這些個別的應用程序一起進入決賽項目所需的膠水。就我而言,我使用project/中的settings.INSTALLED_APPS來辨別應用程序中的哪些視圖對我可用。這樣,如果我從我的INSTALLED_APPS中取出apps.notes,那麼所有東西仍然可以很好地工作,只是沒有註釋。

維護:

這種佈局/方法/計劃也有長期的積極後果。您稍後可以重新使用任何應用程序,幾乎沒有任何工作。您可以從下到上測試系統,確保每個應用程序在集成到整體之前按預期運行,幫助您更快地找到/修復錯誤。你可以實現一個新功能,而不用將其展開到應用程序的現有實例(如果它不在INSTALLED_APPS中,則它們看不到它)。

我確定有更好的文件記錄方式來佈置一個項目和更廣泛使用的方式,但這是迄今爲止對我最有效的方法。

+3

Upvoted與應用程序仍可能有依賴關係的警告。也就是說,他們應該是有道理的。如果你有意見,這有依賴於Django的身份驗證應用程序。如果您有通知應用程序,它可能會依賴您的電子郵件應用程序。所有這些依賴關係都應該記錄在案。 – 2010-04-19 19:33:20

+0

我明白了可重複使用的應用程序在Django是如何工作的,但我的問題是,我的應用程序絕對沒有任何使用超出這個項目的 - 所以我怎麼保持類似的代碼單獨的版本控制的情況下,針對不同的位置嗎? – 2010-04-19 19:34:07

+0

@Justin,你是對的。我寫得很差,謝謝你指出。 @Rob,它取決於你的實例之間改變什麼功能。如果你沒有改變一件作品的核心功能(比如授權),那麼你可以讓自己成爲一個獨立的應用程序,它的實現方式會根據它被拖入哪個項目而有所不同。這樣auth不需要fork,只是項目本身。 – 2010-04-19 19:40:53

4

你應該看看:如果你想重新使用

  • GIT或其他任何CVS(Git是偉大的維護+部署)

    我通常使用這個項目結構:

    • /djangoproject
      • /應用
        • /主#主代碼
        • /靜態#每個子應用程序可以作爲靜態
        • /app1
        • /static#每個子應用都可以靜態服務
        • /app2 ...
      • /scripts#manage.py,wsgi,apache.conf,fabfile.py ...
      • /核心#你的圖書館...
      • settings.py
      • local_settings.py

    在/應用程序的每個應用程式在主urls.py已經autoincluded的urls.py這就是。而且,每個應用程序可以是一個git子模塊(或svn外部)

    此外,使用git,您可以在不同的並行分支(master/dev/customerA/customerB ...)上工作併合並更新。

    django創建真正的可重用性並不是那麼容易。

  • +1

    我正在使用Mercurial進行版本控制,並且我也使用local_settings技巧。我的問題是關於如何保持項目獨立,但仍然保留核心代碼的中央版本控制副本。 – 2010-04-19 19:36:15

    4

    您可以提取常見功能集成到一個單獨的模塊,使您的應用程序依賴於它:

    • my_portal
    • auth_module
    • profiles_module
    • 應用1(取決於auth_module)
    • 應用2 (取決於auth_module和profiles_module)

    我認爲'古典'Django項目似乎'包含'它所使用的應用程序阻止你看到圖片 - 事實上,這是沒有必要的。對於一個你將要有某種可插拔模塊的項目,我建議將這些應用程序組織成雞蛋並使用zc.buildout + djangorecipe來管理所有事情。

    這樣你就可以保持你的模塊在一個單層結構中。雞蛋可以指定依賴關係,所以如果你安裝了application1(見上面),auth_module會自動安裝。

    此外,將不同的配置部署到不同的服務器會很容易。假設你已經安裝了應用程序1,並同時具有應用1和應用2安裝服務器2服務器 - 你可以有兩個CONFIGS:

    server1.cfg:

    [buildout] 
    extends = base_deployment.cfg 
    eggs += application1 
    

    server2.cfg:

    [buildout] 
    extends = base_seployment.cfg 
    eggs += application1 
         application2 
    

    djangorecipe還允許您爲每個構建配置指定不同的設置文件,以便您可以將必要的位添加到主項目的URL和已安裝的應用程序設置。

    更不用說,您還可以爲開發配置設置單獨的配置(例如,安裝了debug = True和Django Debug Toolbar)。

    +0

    我不知道buildout,所以謝謝你提到。我仍然不確定我是否找到了這樣做的最佳方法 - 我對我的項目的不同「排列組合」並不特別感興趣,它在任何地方通常都是一樣的。我只需要能夠改變標題,例如,並在必要時重寫模板。 – 2010-04-20 15:25:45

    +0

    它不僅是「置換」: - djangorecipe允許您指定設置文件使用,所以你可以在一個不錯的,乾淨和版本控制的方式對每個安裝的基礎上重寫的東西(即settings_production.py說「從設置導入*; DEBUG =假」和settings_dev.py說:「從設置導入*; DEBUG =真」 - 擴建允許你控制哪些越來越安裝了第三方(和你自己)模塊的版本,所以你可以重複創建安裝 - 它在本地安裝的一切,不污染系統蟒蛇目錄(類似於VIRTUALENV但更好) – Sergey 2010-04-21 11:56:03