2011-04-07 2 views
1

특정 글로벌 사이트 설정을 저장하는 데 사용하는 '라이브 설정'앱이 있습니다. 일반적으로 내 사이트의 특정 페이지는이 설정을 참조하지만 일반적으로 한 번에 2-3 개만 사용합니다. 그래서 같은 사용자 지정 서식 태그를 사용하여 이러한 설정에 액세스 :Django - 신호를 미리 렌더링 하시겠습니까?

{% settings site_name %} {% settings num_articles %} 

:

{% settings site_name %} 

나는이 태그를 사용할 때마다이 모델은 데이터베이스에서 설정을 검색합니다, 그래서 내가 좋아하는 뭔가가 있다면 데이터베이스가 두 번 쿼리됩니다.

설정 값에 대해 페이지 당 한 번 이상 데이터를 기록하지 않으려 고합니다. 페이지에 사용 된 모든 설정을 가져 와서 데이터베이스를 모두 검색하면 그 데이터를 모두 검색 할 수 있습니다. 훨씬 낫다.

설명서를 살펴본 결과 Django는 설정에 대한 참조를 업데이트하는 데 사용할 수있는 사전 렌더링 신호가 없으므로이 시스템을 최적화하는 방법에 대한 제안이있는 사람이 있습니까? 그리고 분명히 캐싱은 명백한 해답이지만 페이지가 캐시되지 않은 경우에도이를 개선하려고합니다.

답변

1

Daniel에 동의하면 process_template_response이 찾고자하는 고리입니다. 얼마나 많은 설정을 가지고 있는지 알 수는 없지만 모든 설정을 한 번 검색하여 구조와 같은 사전에 저장하면 데이터베이스에 도달하지 않고도 언제든지 액세스 할 수 있습니다. django가 초기화 될 때 요청에 따라 또는 심지어 설정이 거의 변경되지 않더라도 한 번 검색 할 수 있습니다. 또한 django의 신호를 사용하여 삭제 또는 업데이트 할 때 캐시 된 설정을 업데이트 할 수 있습니다.

django-dbsettings을 보면 비슷한 것을 볼 수 있습니다!

+0

process_template_response는 멋지지만 이상적이지 않은 내 견해를 코딩하는 방식을 변경해야한다는 것을 의미합니다 ... render_to_response는 너무 깔끔합니다. 나는 장고가 초기화 될 때 그들을 설정해야한다고 생각한다. – Hanpan

1

Django 1.3에는 새로운 TemplateResponse 클래스가 포함되어 있으므로 나중에 렌더링 프로세스에서 응답을 수정할 수 있습니다 (예 : middleware). 원하는대로 할 수있는 것처럼 보입니다.

0

당신이 이미 가지고있는 것과 비슷한 계획을 고수하고 싶다면, 나는 키리스트를 취하고 모든 관련 값들을 담은 dict를 반환하는 필터를 구현할 것이다.

예 필터 :

def get_settings(key_list): 
    # take values from conf.settings. In practice, can be from any source 
    return dict((k, getattr(settings, k, None)) for k in key_list.split(",")) 
register.filter("get_settings", get_settings) 

사용 : with가 내장 as 전에 단일 값을 예상하므로 I는 필터 대신에 태그를 사용

{# load multiple values with a single call #} 
{% with "KEY1,KEY2"|get_settings as settings %} 
    setting values {{ settings.KEY1 }} and {{ settings.KEY2 }} 
{% endwith %} 

참고.

관련 문제