2011-05-31 46 views
4

我從單個django實例運行多個站點,並期望框架最終可以從一個或多個安裝中爲數百個站點提供服務。如何根據當前請求更改django設置?

我需要根據當前請求修補一些django設置。我已經編寫了一些中間件來猴子修補設置,但是我需要在中間件被調用之前修補這些設置,因爲其他應用程序沒有進行猴子修補的更改(即應用程序運行,然後中間件運行,因此應用程序不會不使用猴子補丁設置)。

我還應該補充說,這主要是爲了我沒有寫的第三方應用程序的好處,所以我不想去添加裝飾器或類似的東西,因爲那樣會搞亂我的升級路徑。

所以:

  • 我怎樣才能獲得訪問某個應用的初始化 .py文件的當前請求?
  • 一個應用程序的初始化 .py每次請求調用一次還是隻調用一次?如果只有一次,我還能如何做到這一點,以便每次請求可以操作一次設置?
  • 做這種猴子補丁安全嗎?我知道它使代碼變得更加不透明,但我不希望每個站點使用不同的wsgi文件,因爲我想允許用戶編輯這些設置中的一部分,並且我的猴子修補程序來自數據庫。
  • 是否有更好的解決方案可以讓某些設置存儲在數據庫中?
+0

爲什麼不從數據庫生成WSGI文件?這對我來說似乎更爲理智。 – che 2011-05-31 07:17:04

+0

有趣。但我認爲就可擴展性而言,如果整個應用程序與網站無關,那麼我可以配置一個新的服務器,部署我的代碼,並且每個服務器只會爲獲取請求的網站提供頁面。 – 2011-05-31 07:18:24

+0

當你說猴子補丁是你在中間件中修改'django.conf.settings'嗎? – 2011-06-24 15:47:46

回答

1

從來沒有過動態更改設置。你無法預測應用程序將來如何部署,而且在大多數情況下,項目會以有趣的方式失敗。

+0

那麼我有什麼替代方案?我需要從數據庫中獲取設置,並在其他應用程序被調用之前應用它們。 – 2011-05-31 07:16:25

+0

不要這樣做。甚至不要嘗試它。相反,將更多計劃放入架構中。 – 2011-05-31 07:17:22

+4

那麼,整個應用程序的重點是用戶可以創建自己的網站,並在數據庫中存儲一些設置...你會建議什麼? – 2011-05-31 07:19:30

1

如果您真的想要有數百個網站會一直動態地重新配置,您可以嘗試Djangos django/conf/__init__.py,它用於將設置提供給框架的其餘部分。您可能能夠以取決於請求的方式對其進行更改,並且它是主機字段。或者至少你會得到許多有趣的失敗。

0

我對這個問題的解決方案是給每個請求,所有的設置和使用中間件即時更新它們,我該怎麼做? 是相當簡單: 這是做這一切

from django.conf import settings 

class DumpObject: pass 

class Settings(object): 
    def process_request(self,request): 
     request.settings = DumpObject() 
     for setting in dir(settings): 
      if not setting.startswith('__'): 
       setattr(request.settings, setting, getattr(settings,setting)) 

的DumpObject只是有這樣我就可以使用object.property符號中間件,它可能是一本字典,但我想保留一些相似在語法中。 這假設您的設置名稱都不以__開頭,這是一個合理的假設。 所以如果我想重寫一個特定的設置,我不保留一個設置文件,我在這個中間件中做。像這樣:

class Settings(object): 
    def process_request(self,request): 
     request.settings = DumpObject() 
     for setting in dir(settings): 
      if not setting.startswith('__'): 
       setattr(request.settings, setting, getattr(settings,setting)) 

     if 'mydomain' in str(request.host): #this is thanks to django-hosts project 
      request.settings.GOOGLE_ANALYTICS_ID = '89298393-238' 

當然,這並不考慮從Django的訪問設置老辦法 的問題。CONF導入設置

settings.GOOGLE_ANALYTICS_ID = 'the value in settings.py' 

但它其實並不重要,因爲你可能只是想改變在具有請求對象,可用的情況下設置。

相關問題