2012-01-04 64 views
1

我使用Django 1.3設置變量在我settings.py與mod_wsgi的</p> <p>改變從settings.py

DISABLE_SYSTEM = False 
DISABLE_USER_INTERFACE = False 
MIDDLEWARE_CLASSES = [ 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
] 
if DISABLE_SYSTEM: 
    MIDDLEWARE_CLASSES.insert(0, 'SomeMiddleware') 
if DISABLE_USER_INTERFACE: 
    MIDDLEWARE_CLASSES.append('SomeOtherMiddleware') 

當我設置DISABLE_SYSTEMTrueSomeMiddlewareprocess_request函數返回HttpResponse一條警告消息而下面的Middeware不會運行。這給了我一種系統停機維護

DISABLE_USER_INTERFACE過濾器request任何用戶稱爲受阻取景功能,同時admin URL和管理功能正常運行。

到目前爲止,我用這種方法來維護不同的類型,我只是簡單地將它從文件中改爲,然後觸摸wsgi重新加載python模塊。但現在,我需要使用一種預定的例程來停止基於用戶的請求,並對後臺進行一些維護,並從管理員那裏進行一些維護。

在這一點上,我係統(但不是用戶)需要設置DISABLE_USER_INTERFACETruesettings.py並開始維護。但我無法找到porper的方式來做到這一點或更好的方式來處理這不是從settings.py而是在別的地方。

settings py中的行比變化DISABLE_USER_INTERFACE是因爲我需要每天使用這個函數一次,並且對於每個請求使用這兩個中間件對我來說似乎不合邏輯。所以在我目前的模型中,他們只在需要運行時運行。

任何建議,將不勝感激。

更新:我想要做的是在每天的19:00至19:30期間禁用用戶界面。我不確定如何製作中間件級別檢查:

if 19:00<now()<19:30: 
    stop system 

對於每個請求。我需要更高效的方法來避免不必要的過程。或者中間件是那種作品的正確選擇?

回答

1

當您計劃對設置進行更改時,您可能需要重新考慮您正在執行的操作。

您的中間件可以更多,更聰明。這可以使您的設置變得非常笨重。

我強烈建議您有一個SomeMiddleware類,即總是安裝

然後SomeMiddleware類可以檢查settings並確定它應該執行的行爲。

還有更好的方法來做到這一點。

您不一定需要修改計劃維護的設置。在運行Django應用程序中,您有很多很多方式與中間件進行通信。最快的之一是通過數據庫。

您可以通過一個(或幾個)屬性來定義「操作模式」類定義,這些屬性僅由中間件獲取以查看發生了什麼。您可以編寫管理應用程序在此表上執行簡單更新以更改模式。

您可以使用「操作模式」文件名(如果存在)更改中間件的行爲。你只需要做os.path.exists() kind函數來檢查(快速)做什麼。

+0

我想要的是在19.00到19.30之間關閉系統,我想寫一箇中間件來檢查每個請求的時間,如果它是維護時間,但是運行一個'if 19.00 FallenAngel 2012-01-05 11:59:35

+1

「但運行一個如果19.00 <現在()<19.30:停止系統控制每個請求似乎是不必要的」。實際上,開銷是無法估量的。但是,這就是爲什麼我建議在已知位置創建文件的原因。 cron可以根據您的時間表創建和刪除此文件。 – 2012-01-05 12:47:49

+0

我想你是對的,這是更好的(: – FallenAngel 2012-01-05 14:08:13