2011-05-09 70 views
22

我希望在每次重新啓動/重新加載django服務器時刷新memcached。我使用cherrypy生產和內置服務器進行開發。重新啓動django服務器時清除緩存的最佳位置

我想補充一點,以settings.py中,高速緩存之後:

from django.core.cache import cache 
cache.clear() 

但它是一個遞歸引入:

Error: Can't find the file 'settings.py' in the directory containing 'manage.py'. It appears you've customized things. 
You'll have to run django-admin.py, passing it your settings module. 
(If the file settings.py does indeed exist, it's causing an ImportError somehow.) 
make: *** [server] Error 1 

任何其他建議?謝謝。

回答

50

把代碼放在settings.py以外的代碼中是不好的做法。它更適合作爲管理命令:

from django.core.management.base import BaseCommand 
from django.core.cache import cache 

class Command(BaseCommand): 
    def handle(self, *args, **kwargs): 
     cache.clear() 
     self.stdout.write('Cleared cache\n') 

,您可以通過在someapp/management/commands堅持把它添加到您的項目。通過做./manage.py clearcache

utils 
├── __init__.py 
└── management 
    ├── __init__.py 
    └── commands 
     ├── __init__.py 
     └── clearcache.py 

您可以立即清除緩存:例如,你可以創建一個名爲utils新的應用程序,並添加到您的INSTALLED_APPS和目錄結構是這樣的。如果你想每次運行clearcache您RUNSERVER你可以寫一個shell別名做到這一點:

alias runserver='./manage.py clearcache && ./manage.py runserver' 

或者我認爲你可以把它寫成一個獨立的腳本和configure the settings it requires by hand

from django.conf import settings 

# obviously change CACHES to your settings 
CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
     'LOCATION': 'unique-snowflake' 
    } 
} 

settings.configure(CACHES=CACHES) # include any other settings you might need 

from django.core.cache import cache 
cache.clear() 

像這樣編寫獨立腳本將阻止循環導入,並允許您從settings.py中導入它。雖然不能保證settings.py只能導入一次,所以一般情況下我會避免這種情況。如果信號框架可以在每次啓動應用程序時觸發一次事件,那麼在爲這樣的東西加載設置之後,它會很好。

+0

當我在外部對服務器進行HUP操作時不起作用,無論如何重新啓動/重新加載服務器,我都希望它調用清除緩存。我在生產中使用'runit'來啓動/停止cherrypy。在這種情況下,你的建議不起作用。我希望解決方案可用於不同的設置。 – 2011-05-09 22:49:02

+1

我不知道'runit'是什麼,但是你可以隨時使用管理命令。 – zeekay 2011-05-09 22:49:51

+0

我假設你有某種初始化腳本?只需添加一個對clearcache的調用即可。 – zeekay 2011-05-09 22:51:08

0

這個怎麼樣?在settings.py中定義一個布爾值,例如CLEAR_CACHE_ON_RESTART = True,然後在其他地方檢查它是否爲True。如果是,則清除緩存並將其設置爲False。此代碼可以放置在任何視圖中(如主視圖),甚至可以放在manage.pyurls.py(儘管我沒有檢查它,但看起來不太好)。試一試!

+1

人們很容易把提到_somewhere_的代碼,其在加載時間(urls.py,views.py,任何應用程序的models.py)加載。但是,我想確保它在每次運行時只加載一次。不是每個線程或每個請求一次。出於這個原因,你的建議是不可接受的。 – 2011-05-09 22:46:50

+0

爲什麼不呢?正如我所說的,你需要檢查布爾全局常量(在設置中定義它)並在首次檢查後將其設置爲假。所有其他檢查都無濟於事。另外請注意,(我認爲)'urls.py'只在服務器重啓後加載一次(儘管我沒有檢查過)。儘管如此,這不是正確的做事方式。要做到這一點,你真的應該寫一些外部腳本。 – freakish 2011-05-10 07:22:55

+0

因此,每次他想重新加載/重新啓動服務器時,他們都必須在False與True之間切換? – 2017-11-18 11:55:22

3

Django Extensions可讓您通過

manage.py clear_cache 

的詳細信息,並在其docs許多進一步命令擦拭緩存。

+0

謝謝!一個不會重新發明輪子的勝利! – Florian 2017-05-15 13:01:06

0

如果代碼以需要新緩存的方式更改,通常不會使緩存失效。不在上每重新啓動。

這最好通過使用Django功能處理:settings.CACHES.VERSION [1],並在每次更改更改緩存數據格式的代碼時增加該數字。 這樣,在部署上,當您部署新代碼時,您將自動使用新緩存,但如果您的代碼與先前的代碼緩存兼容,則保留緩存。

[1](https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-CACHES-VERSION

相關問題