2011-01-06 74 views
4

我有兩個密切相關的站點,主站點和移動站點,作爲Django應用程序託管。他們將具有許多相同的功能並需要訪問相同的數據。主要區別在於模板會有所不同,網站的結構將會有所不同。創建2個共享90%數據和代碼的django站點

我有兩個獨立的虛擬主機,每一個(但我不必這樣做)。我的第一個想法是,Django網站框架有助於解決這個問題,但這些文檔似乎沒有描述我的用例。

有人可以給我一個提示,知道我是否在正確的軌道上?例如,urls.py將需要有所不同,因爲主頁在應用程序之間完全不同。主要目標是要共享兩個不同應用程序中的數據,並管理不需要重複的代碼。

從主站點:

  • 用戶提交存儲在模型

從移動網站中的項目:

  • 用戶查看項目的列表,看到了一個剛剛在主網站上輸入
  • 用戶對最近添加的項目給出5星評級

從主站點:

  • 用戶瀏覽的高度評價項目的列表和最近添加的項目(現在有很高的評價)顯示在列表上。

回答

1

好的,這兩個答案都很好,併爲我最終解決方案的選擇做出了貢獻。

在settings.py文件中有一個名爲ROOT_URLCONF的選項。我創建了兩個設置。PY文件,稱爲settings_desktop.py和settings_mobile.py並在每個這些用下面的代碼:

from settings.py import * 

ROOT_URLCONF = 'myapp.urls_mobile' 

(或臺式機的情況下,myapp.urls_desktop)

這其實給了很多很酷的功能,比如能夠爲每個網站使用不同的模板目錄,但實際上我不打算這樣做。

然後我創建的WSGI文件的兩個版本,其中唯一的區別是該行:

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings_mobile' 

在各虛擬主機的唯一區別是WSGIScriptAlias行指向每個主機的不同wsgi文件。

這使我可以有效地使用一個django應用程序,可以輕鬆地容納這兩個網站。

感謝您幫助解決這個問題。

4

看看this answer to a similar question。基本上,您可以使用相同的視圖,並根據用戶代理返回不同的模板。 另外,如果你構建你的應用程序邏輯,以便它以django術語被分解成不同的「應用程序」,那麼如果你需要不同流程的相似組件,你可以重新使用它們。 希望這可以讓你關閉並運行。

UPDATE:

因此,可以說,你有哪些有它自己的urls.py models.py和views.py,使您的主網站的功能你的主站點http://www.mainsite.com/。然後你有http://www.m.mainsite.com/有它自己的一套網址和視圖。然後,您可以導入主站點的模型並在移動站點視圖中使用它們。

+0

感謝您的評論,這留下了一個問題的重要部分未答覆,但。我真的需要有不同的urls.py將用戶發送到不同的視圖,而不僅僅是同一頁面的不同渲染。 – newz2000 2011-01-06 21:03:17

0

我做了一件非常相似的事情。我的解決多個urls.py這個問題的方式是這樣的:

創建兩個urlconf,每個站點一個;

創建一個新的中間件:

from django.utils.cache import patch_vary_headers 

class DomainMiddleware: 

    def __init__(self): 
     pass 

    def process_request(self, request): 

     #avoid problems when reaching the server directly trough IP 
     host = request.META.get('HTTP_HOST', None) 
     if host is None: return 

     host = host.split(':')[0] #remove port number 

     if host is mobile: 
      urlconf = "mobile.urls" 
     else: 
      urlconf = "default.urls" 

     request.urlconf = urlconf 

    def process_response(self, request, response): 
     patch_vary_headers(response, ('Host',)) 
     return response 

檢查也是爲什麼你要做patch_vary_headers on the docs