2011-05-09 5 views
22

django 서버를 다시 시작할 때마다 memcached를 비우고 싶습니다. 생산을 위해 cherrypy를 사용하고 개발을 위해 내장 서버를 사용합니다.장고 서버를 다시 시작할 때 캐시 지우기 가장 좋은 장소

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

를하지만 재귀 수입한다 :

나는 바로 캐시 한 후이의 settings.py에 추가 할

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 그것을 고집하여 프로젝트에 추가 할 수있다. 예를 들어 당신은 utils라는 새로운 응용 프로그램을 만들 수와 같을 것이다 당신의 INSTALLED_APPS 및 디렉토리 구조에 그 추가 : 지금 당신이 할 수있는

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

을 캐시 지우기 ./manage.py clearcache을 수행하여. 당신이 위해 clearCache 때마다 실행하려면 방금 그렇게 쉘 별명을 쓸 수의 runserver :

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() 
:

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

내가 독립 실행 형 스크립트와 configure the settings it requires by hand로 쓸 수있을 것 같아요

이렇게 독립 실행 형 스크립트를 작성하면 순환 가져 오기가 금지되어 settings.py에서 가져올 수 있습니다. settings.py는 한 번만 가져올 것이라는 보장은 없지만 일반적으로 나는 이것을 피할 것입니다. 신호 프레임 워크가 앱을 시작할 때마다 한 번씩 이벤트를 발생시킬 수 있다면 좋을 것입니다.

+0

서버를 외부에서 HUP 할 때 작동하지 않습니다. 서버 재시작/재로드와 상관없이 캐시를 호출하기를 원합니다. 생산에'runit'을 사용하여 체리 피를 시작/중단합니다. 이 경우 귀하의 제안은 효과가 없습니다. 솔루션을 다른 설정에 사용할 수 있기를 바랍니다. –

+1

'runit'은 무엇인지 모르겠지만 언제든지 관리 명령을 사용할 수 있습니다. – zeekay

+0

어떤 종류의 init 스크립트가 있다고 가정하고 있습니까? 그냥 clearcache에 대한 호출을 추가하십시오. – zeekay

0

어때? 부울 값을 settings.py으로 정의하십시오 (예 : CLEAR_CACHE_ON_RESTART = True). True인지 확인하십시오. 그렇다면 캐시를 지우고 False으로 설정하십시오. 이 코드는 모든보기 (기본보기와 같은)에 배치 할 수 있으며 manage.py 또는 urls.py (아마도 확인하지 않았지만 너무 좋지 않음)에도 배치 할 수 있습니다. 시도 해봐!

+1

로딩 시간 (urls.py, views.py 어떤 애플리케이션 models.py)에로드 할 _somewhere_ 한 코드를 넣어 유혹. 그러나 런타임 당 한 번만로드됩니다. 스레드 당 또는 요청 당 한 번. 그런 이유로 귀하의 제안은 받아 들일 수 없습니다. –

+0

왜 안 되니? 앞에서 말한 것처럼 boolean 전역 상수 (설정에서 정의)를 확인하고 처음 확인한 후 false로 설정해야합니다. 다른 모든 수표는 아무 것도하지 않습니다. 또한, (나는 생각한다)'urls.py'는 서버를 재시동 한 후에 단 한 번만로드된다. (체크하지는 않았지만). 여전히, 이것은 일을하는 올바른 방법이 아닙니다. 이 작업을 올바르게 수행하려면 실제로 외부 스크립트를 작성해야합니다. – freakish

+0

그래서 서버를 다시로드하거나 다시 시작하려면 매번 False에서 True로 전환해야합니까? –

3

Django Extensions

manage.py clear_cache 

대한 추가 정보를 자신의 docs많은 추가 명령을 통해 캐시를 닦아 수 있습니다.

+0

감사합니다! 바퀴를 재발 명하지 않기위한 승리! – Florian

0

새 캐시가 필요한 방식으로 코드가 변경되면 일반적으로 캐시를 무효화하지 않을 것입니다. 에 없습니다.마다 다시 시작하십시오.

장고 기능을 사용하면이 기능을 가장 잘 처리 할 수 ​​있습니다 : settings.CACHES.VERSION [1], 캐싱 된 데이터의 형식을 변경하는 코드를 변경할 때마다이 번호를 늘리십시오. 그런 식으로 배포시 새 코드를 배포 할 때 자동으로 새 캐시를 사용하지만 코드가 이전 코드와 캐시 호환되는 경우 캐시를 유지해야합니다.

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

관련 문제