2013-09-25 75 views
5

我對相當一維的Django實現很滿意,但現在試圖理解多站點與共享東西的過程。Django站點框架初始設置

我已經閱讀了Django Sites Framework以及該主題上的許多帖子,但是我沒有得到如何啓動使用相同數據庫的第二個站點的基礎知識,但是將其本身顯示爲單獨的域名。

我有一個非常高興和由書籍django網站組成的一個應用程序運行在一個項目中。

要使用教程的說法,我開始一個項目「mysite的」與

django-admin.py startproject mysite 

,然後用

manage.py startapp polls 

Q1啓動一個應用程序「民意調查」:是否站點框架假設每個網站都是單獨的項目或單獨的應用程序?

該項目中的第二個應用程序'polls2'似乎是有道理的,但其中定義SITE_ID的settings.py似乎是一個整體項目。有沒有一種方法可以製作按應用程序設置?

與'mysite'相鄰的第二個proj'mysite2'會給我第二個結構,它有自己的settings.py和一個單獨的SITE_ID,但是這樣做似乎違反了「DRY」原則,因爲我會複製相鄰姐妹項目的許多元素。

Q2:聽起來我需要將數據庫模型(models.py)重新定義爲多對多關係,以便在站點之間共享數據。這是否改變了Django訪問這些表的方式,還是現有網站的數據庫也需要重建?

對於實現網站框架的預期流程,您的指導意見非常重大。

回答

12

Q1:網站框架是否假設每個網站都是單獨的項目或 單獨的應用程序?

一個Django網站通常由多個應用程序組成,所以「單一應用程序」方法不會真正起作用。但從每個網站的單獨項目角度考慮也無濟於事。 只有必須爲每個站點分開的東西是設置文件。

爲每個站點設置單獨的設置文件是否違反了DRY原則?不必要。您可以(也應該)使用通用設置創建基本設置文件。然後,您可以將它們導入到每個站點的設置文件中。

例如,在你的項目目錄,你可以有三種設置文件:

base_settings.py 
siteA_settings.py 
siteB_settings.py 

siteA_settings.pysiteB_settings.py將從base_settings.py導入所有設置。

唯一認爲你必須放在每個站點設置文件是SITE_ID設置與個人站點ID。所有其他設置可以在各個站點之間共享(base_settings.py),也可以針對特定站點(siteA_settings.py,siteB_settings.py)進行分配,具體取決於您的個人需求。例如,如果您有單獨的每個站點模板,但是如果模板在站點間共享,則您可以在每個站點設置中重新定義TEMPLATE_DIRS設置。與所有其他設置相同 - 網址結構,安裝的應用程序列表等。

然後,您只需指定設置文件即可選擇要運行的網站。例如與Django開發服務器:

python manage.py runserver --settings=mysite.siteA_settings 

python manage.py runserver --settings=mysite.siteB_settings 

Q2:聽起來像是我需要的數據庫模型(models.py)重新定義成一個 多對一用於在站點之間共享數據的多對多關係。 只是改變了Django訪問這些表的方式,還是現有的 網站的數據庫也需要重建?

只要共享所有對象,不需要修改站點間共享的模型。只有當您希望能夠控制哪個模型的對象出現在哪個站點上時,您需要通過從模型添加關係(多對多或外鍵,取決於您的需要)來解釋該關係Django的Site模型。這樣做的確會改變底層數據庫結構(因爲添加一個外鍵需要在給定模型的數據庫表中增加一個列,並且添加一個多對多關係需要一個額外的表)。 Sites框架本身也使用它自己的數據庫表,因此您需要在啓用它之後同步數據庫。

添加關係後,您可以輕鬆地將查詢限制爲適用於當前網站的對象 - 例如,使用the CurrentSiteManager。另一方面,您仍然可以使用默認管理器訪問所有對象(即通常訪問ORM的Model.objects形式)。

+0

感謝您的詳細響應。稍微澄清 - 當你說「你會選擇你想要運行的站點......」這種方法是否允許兩個站點同時運行?對我來說這不是一個單獨或另一個目標,都需要工作。仍然吸收所有這些。 Prob只需要跳進去嘗試一下(並且希望我不會搞砸太多:) – RossGK

+0

當然 - 在開發過程中,您只需同時運行Django開發服務器的兩個實例,每個站點一個。在生產中,您將兩個單獨的規則添加到您的Web服務器配置中,每個座標一個。 –