2010-08-31 146 views
4

我處於需要將兩個Django應用程序合併到一個可重用應用程序的情況。它們都不是特別大,但它們肯定不是微不足道的應用程序,爲了保持可讀性/完整性,我試圖讓這兩個應用程序在一定程度上分開。我是否正確地組織了我的django應用程序?

我可以將每個應用程序設置爲一個子包(這可能是實現這一目標的一種pythonic方式),或者我可以堅持Django的約定,並在每種情況下分別分開功能。

一個Python化「子包」的方法:

package 
|-- __init__.py 
|-- views.py 
|-- models.py  # imports models from both sub-packages 
|-- tests.py  # imports TestCase instances from both sub-packages 
|-- etc.   # shared stuff 
|-- a 
| |-- __init__.py 
| |-- views.py 
| |-- models.py 
| |-- tests.py 
| `-- etc.  # a-specific code 
`-- b 
    |-- __init__.py 
    |-- views.py 
    |-- models.py 
    |-- tests.py 
    `-- etc.  # b-specific code 

或者更直接地安撫神靈的Django:

package 
|-- __init__.py 
|-- views 
| |-- __init__.py 
| |-- a.py 
| `-- b.py 
|-- models 
| |-- __init__.py # imports models from a and b 
| |-- a.py 
| `-- b.py 
|-- tests 
| |-- __init__.py # imports TestCase instances from a and b 
| |-- a.py 
| `-- b.py 
`-- etc. # shared/additional files 

雖然我傾向於前者,此刻瘦(這感覺我的直覺告訴我,雖然兩者都工作(並且都涉及導入'hacks'以符合Django的結構),但最好的選擇取決於a和b的內容 - 具體來說,代碼是多少共享或app-具體。在每個子目錄中不斷重複__init__.py,a.py,b.py模式並不合適!

我很想知道哪些更適合於處理Python的經驗豐富的人!

ps。 我知道他們可以作爲兩個不同的應用程序生活,但他們如此相互依賴,現在我覺得他們應該合併! (即使除了改進的單個Django應用程序的可移植性)

回答

2

Flat比嵌套更好。

由兩個對等應用程序構建的「複合」應用程序很好。它運作良好。

它通過允許這兩個組件在更大的應用程序中成爲「即插即用」選項來促進重用。

除非你被迫去做,否則不要築巢。 強制你的窩的頭號原因是名稱衝突。你沒有這個,所以你不需要任何嵌套。

+0

爲了提高外行的答案的可讀性,你能否清楚哪一個是'扁平'的,哪一個是'嵌套'的,哪一個更好? – thomaspaulb 2013-05-08 15:11:58

+0

Afaik禪宗是指python代碼,而不是文件結構,不是嗎? – dietbacon 2017-03-15 13:08:23

1

我不是python的專家,但我總是喜歡儘可能多地分離應用程序和其他工件。

我對我自己的django項目採用了blog中描述的方法,它需要對django進行一點調整。迄今爲止,它的效果很好。

直接鏈接到github project

+0

感謝您的鏈接! – adamnfish 2010-09-01 08:50:38

1

在我的項目,我經常要組織的觀點和測試莫名其妙,所以我用的結構是這樣的:

package 
|-- __init__.py 
|-- models.py  # models are in one file 
|-- etc.   # shared stuff 
|-- tests 
| |-- __init__.py 
| |-- tests_orders.py 
| |-- tests_clients.py 
| |-- 
| `-- etc. 
|-- views 
| |-- __init__.py 
| |-- orders.py 
| |-- clients.py 
| |-- 
| `-- etc. 

對於有一個文件視圖功能,更大的項目是痛苦的(對我來說)。

這是什麼適用於我正在工作的一些項目 - 希望有人認爲這也有用。

相關問題