2010-02-26 2 views
15

장고 모델의 post_save 신호에 메소드를 연결하고 있습니다. 이렇게하면 모델이 수정 될 때마다 캐시 된 항목을 지울 수 있습니다.Django 모델을 저장하는 동안 post_save가 두 번 올리는 이유는 무엇입니까?

내가 가지고있는 문제는 모델 저장시 신호가 두 번 트리거된다는 것입니다. 꼭 아무것도 해칠 필요는 없습니다 (코드가 정상적으로 오류를 일으키지 만).

from blog.models import Post 
from django.db.models import signals 

def purge_cache(sender, **kwargs): 
    print 'Purging %s' % sender 

signals.post_save.connect(purge_cache, sender=Post) 

이 장고의 안정적인 1.1.1 버전을 사용하고 있습니다 :

빠른 예를 들어, 그냥 (dev에 서버를 사용) 콘솔에 모델을 인쇄.

업데이트 된 정보 : post_save 두 번 트리거하는 이유 문제가 지금 발견되어 있기 때문에 모든 사람의 의견 의견으로

, 내 질문을 수정했습니다. 내 생각에 내 models.py 코드는 두 번 가져오고 post_save는 여러 번 연결됩니다.

가져 오기/실행 이유를 알아내는 가장 좋은 방법은 무엇입니까? 이 문제의 뿌리를 찾고 있지만

+1

당신은'post_delete' 연결 라인을 주석하는 경우,'post_save' 신호가 두 번 발생 다음 settings.py에서 "내 사이트"접두사를 제거

이 문제를 해결? – Desintegr

+2

django 코드를보고 실제로 save()를 보내지 않습니다. post_delete 신호를 받았고 post_save를 두 번 가져 오지 않았습니까? –

+0

@Desintegr - 지금은 시도 할 수 없지만 좋은 생각입니다.나는 오늘 밤 그것을 시도하고 질문을 업데이 트됩니다. 그래도 post_delete를 제거한 후에도 계속 발생하면 "왜 post_save 신호가 두 번 오르는 이유가 무엇입니까?"라는 질문을 변경합니다. :) models.py 코드가 두 번 실행되고 신호가 여러 번 연결되는 것일까 요? –

답변

12

분명히, Python is sensitive to the way you import modules. 제 경우에는 블로그 응용 프로그램 내부의 가져 오기 코드 중 하나는 문제가 아니지만 Django가 초기 가져 오기를 수행하는 데 사용되는 INSTALLED_APPS 구성 문제가 있습니다. 내 블로그 애플리케이션 내부

나는 같은 수입을 사용했다 :

from blog.models import * 

내 settings.py는 다음과 같이 구성되었다 :

나는 원래 수입 경로를 가지고 있기 때문에 "내 사이트"접두사가 추가되었습니다
INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    ...snip... 
    'sorl.thumbnail', 
    'mysite.blog', 
) 

사이트 배포시 발생하는 문제 나중에 WSGI 스크립트에 여러 경로를 추가하여이 문제를 해결했습니다 (개발 서버와 동일하게 작동).

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    ...snip... 
    'sorl.thumbnail', 
    'blog', 
) 
7

, 당신은 두 번 신호를 등록 방지하기 위해 빠른 해결 방법을 사용할 수 있습니다

signals.post_save.connect(my_handler, MyModel, dispatch_uid="path.to.this.module") 

Source합니다.

+1

나는 이것을 보았지만 사람들이 수입품을 고치지 않아도되기 때문에 그들이 실제로 추가 한 해킹처럼 보입니다. 그래도 도와 ​​줘서 고마워! –

+2

위의 @LanceMcNearney에 동의하지 않는다고 생각합니다. 라이브러리 코드를 작성한다고 가정하십시오. 소비자가 코드를 가져 오는 방식을 제어 할 수는 없습니다. –

+0

잘 django는 이전 버전과의 호환성으로 유명합니다.이 솔루션을 사용하면 최신 버전에서이 문제를 피하고 이전 버전의 동작을 보존 할 수 있습니다. –

0

다음은이 문제에 대한 티켓입니다 : Django's signal framework may register listeners more than once #3951. Django의 SVN 버전에서 수정되었습니다.

문제는 정확히 말한 것입니다 : 신호를 등록하는 모듈은 두 번로드되는 경우도 있으며, 경우에 따라 다른 가져 오기 경로로로드됩니다. 따라서 이러한 방식으로 가져온 각 모듈은 장고에 의해 동일하게 등록 된 다른 모듈로 잘못 해석됩니다 신호.

+1

나는 여전히 장고 1.6에이 문제가있다. dispatch_uid를 제공해도 도움이되지 않습니다. – jvannistelrooy

관련 문제