2016-06-27 2 views
2

장고에로드 할 인증이 필요한보기를 만들었습니다. 자격 증명이 올바르지 않으면 오류 403 페이지가 다시 전송됩니다. 내가 ...이처럼 urls.py 파일에 캐시 할 뷰를 선언 한 이후 Django에서보기를 선택적으로 캐시하는 방법

url(r'^example/example-url/(?P<special_id>\d+)/$', 
     cache_page(60 * 60 * 24 * 29, cache='site_cache')(views.example_view), 
     name="example"), 

은 ... 다음 심지어 오류 페이지가 캐시되고있다. 캐시는 29 일 동안 유지되므로이 작업을 수행 할 수 없습니다. 또한 페이지가 성공적으로 캐싱되면 내보기에서 수행하는 인증 단계를 건너 뛰고 데이터는 취약하게됩니다. 오류가 발생할 때가 아니라 결과가 성공할 때만 django가 페이지를 캐싱하기를 원합니다. 또한 캐시 된 페이지는보기의 인증 후에 만 ​​제공되어야합니다. 어떻게해야합니까? setting.py에서

내 캐시 설정 :

+0

캐싱 뷰는 가치가 없습니다. – e4c5

+0

아쉽게도 서버의 부하를 줄이기 위해보기를 캐시해야합니다. 생성 된보기는 크고 데이터가 많은 피드이며 여전히 많이 최적화 된 상태에서로드하는 데 약 20 초 가량 소요됩니다. 일단 그것이 만들어지면, 그것은 한 달 동안 좋습니다. 그래서이 경우 매우 가치가 있습니다. – turtlefranklin

+1

오, 확인. 나는 이것이 우리가 여기서 항상 얻게되는 조기 최적화 문제 중 하나 일 뿐이라고 생각했습니다. – e4c5

답변

1

간단한 작업 주위 사전에

CACHES = { 
'default': { 
    'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
    'LOCATION': 'unique-snowflake', 
}, 
'site_cache': { 
    'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 
    'LOCATION': '/var/tmp/django_cache', 
} 

}

감사합니다. urls.py을 이와 같이 변경하십시오.

url(r'^example/example-url/(?P<special_id>\d+)/$', 
     views.example_view, 
     name="example"), 

다음과 같이 당신의 example_view을 수정

def example_view(request, sepcial_id): 
    if request.user.is_authenticated(): 
     key = 'exmpv{0}'.format(special_id) 

     resp = cache.get(key) 
     if not resp: 
      # your complicated queries 

      resp = render('yourtemplate',your context) 
      cache.set(key, resp) 
     return resp 
    else: 
     # handle unauthorized situations 

내가 대신 파일 기반 캐싱의 memcached를 위해 전환에서 당신을 관심을 수 있습니까?

+0

나는 이것의 모양을 좋아한다! 나는 내일 아침에 그것을 시험해 볼 것이고, 그것이 효과가 있다면 나는 당신에게 받아 들여진 대답을 줄 것이다. 이것은 캐시를 다루는 훌륭한 방법처럼 보입니다. memcached도 살펴볼 것입니다. – turtlefranklin

+0

이 사용 사례의 경우. 한 달에 1 ~ 4 번 (봇에 의해) 데이터가 읽히기를 기대하기 때문에 파일 기반 캐싱을 고수 할 것입니다. 그러나 제안에 감사드립니다. 이제 memcached의 이점을 알고 있습니다! – turtlefranklin

+0

당신 말이 맞아요. 그 때문에 memcached가 필요하지 않습니다. – e4c5