2009-09-19 4 views
1

요청 당 한 번만 을 실행해야하는 간단한 사용자 지정 컨텍스트 프로세서를 만들었습니다. 일부 로깅 훅을 넣은 후에는 요청 당 두 번 호출되는 것을 발견했습니다. .요청 당 두 번 호출되는 장고 사용자 지정 컨텍스트 프로세서

워드 프로세서에 누락 된 알려진 "기능"입니까? 상속 트리의 템플릿 수와 관련이 있습니까? 1.03의 버그입니까?

+0

나는 이것을 더 보았고 각 컨텍스트 프로세서가 템플릿 상속 트리에서 템플릿 당 한 번 실행되는 것 같습니다. base.html과 homepage.html과 같은 두 개의 템플릿이 있습니다. 이것은 실제로 비효율적 인 것처럼 보입니다. 나는 그것이 내 바리의 단순한 감시 일 뿐이라고 기대하고있다. – meppum

+1

나에게 괜찮은 것 같습니다. 두 개의 템플리트가 있고 둘 모두 적절한 컨텍스트가 필요합니다. struts의 인터셉터 스택처럼 들립니다. – Seth

+1

어떤 로깅 훅을 사용 했습니까? 때로는 파이썬의 로깅 패키지를 사용하고 실수로 여러 핸들러를 추가하면 메시지 출력이 두 번 표시됩니다. 해당 이벤트의 시간 소인을 확인하십시오. –

답변

1

문제점을 파악했습니다. 원래 컨텍스트가 아닌 사전이 리턴되면 컨텍스트 프로세서가 다시 실행되는 것처럼 보입니다. 이유는 모르겠지만 근본적인 코드를 살펴 보지 않았기 때문에 확신 할 수 없지만 원본 컨텍스트를 업데이트하고 문제가 해결되지 않은 상태로 돌아온 후에는 확신 할 수 없습니다. 감사.

+0

오랜 시간이 걸렸지 만 솔루션에 대해 좀 더 설명해 주시겠습니까? :) 고마워요 – fceruti

+4

나는 동일한 문제가 있었지만 문제는 나를 위해 django - 디버그 - 툴바는 모든 컨텍스트 프로세서가 다시 실행되도록하는 자체 RequestContext를 만드는 것 같다. RequestContext는 소스를 grepping하는 동안 찾을 수 없지만 INSTALLED_APPS 및 MIDDLEWARE_CLASSES에서 제거하면 확실히 문제가 해결되었습니다. –

2

이것은 예상 된 동작이 아닙니다. 컨텍스트 프로세서는 한 번 실행됩니다 each time a RequestContext is instantiated). 템플릿 상속의 경우 the same context instance is passed up to the parent template이므로 컨텍스트 프로세서를 다시 실행해서는 안됩니다. 로깅이 오해의 소지가 있거나 (@Vinay Sajip의 코멘트를 보시오), 각 요청에 대해 추가 RequestContext가 실행되는 코드 위치를 알아야합니다 (삽입 태그 나 템플릿을 렌더링하는 다른 사용자 정의 템플릿 태그를 사용하고 있습니까? RequestContext를 인스턴스화 하시겠습니까?)

EDIT 죄송합니다. "inclusion tag"는 inclusion_tag 데코레이터를 사용하는 태그가 아니라 다른 템플리트를 렌더링하는 일부 태그입니다. 컨텍스트를 취하는 일반적인 inclusion_tag는 새로운 Context를 인스턴스화하지 않고 기존 컨텍스트 개체를 전달해야합니다.

"import pdb; pdb.set_trace()"를 컨텍스트 프로세서에 넣고 Django dev 서버에서 코드를 실행하고 콘솔에서 pdb를 사용하여 스택 추적을 검사 할 때마다 컨텍스트 프로세서가 충돌하여 어디에서 호출되는지 확인합니다.

+0

'context'를 인수로 사용하는 사용자 지정 포함 태그를 사용하고 있습니다. 그것이 예상 된 행동이라고 생각하면? 나는 inclusion 태그가 컨텍스트 프로세서를 다시 실행하게 만들었다는 것을 깨닫지 못했습니다. – meppum

0

프로덕션 웹 서버, Apache 등에서 발생합니까? 아니면 내장 개발 서버에서 발생합니까? 나는 비슷한 경우를 로컬에서 보았지만 runserver의 단점이라고 확신합니다.

2

내 경우에는 djangodebug_toolbar을 사용할 때이 버그가 발생합니다. allauth 패키지에서 providers_media_js : 내 경우

문제가 즉 templatetag했다 :

debug_toolbar.middleware.DebugToolbarMiddleware

+0

여기에서 DebugToolbarMiddleware를 주석 처리하여 수정했습니다. –

+0

'debug_toolbar.panels.template.TemplateDebugPanel'을 주석 처리하고 다른 디버그 도구 모음 패널을 가져올 수도 있습니다. 여기 Github 발행 티켓이 있습니다. https://github.com/django-debug-toolbar/django-debug-toolbar/issues/353 – seddonym

0

희망이 도움이 주석이 시도를 방지합니다.

컨텍스트 프로세서에서 아무 것도 반환하지 않고 문제가 지속되는지 확인하십시오. 그런 다음 어떤 변수가이 문제의 원인인지 알아보십시오.

관련 문제