2017-09-24 6 views
0

많은 뷰에서 사용되는 파이썬 함수가 있습니다. 특히 ugsgi에서 실행되는 장고 앱입니다. 이 함수는 데이터베이스로 데이터를 추적합니다. 함수를 포함하는 뷰에 대한 특정 호출을 위해 해당 함수를 비활성화하는 데코레이터를 만들려고했습니다. 본질적으로 :특정 함수가 작동하지 않게하는 파이썬 장식 자

@disable tracking 
def view(request): 
    track(request) //disabled by decorator 

데코레이터는 트랙의 전역 정의를 무효로하는 void 함수로 대체함으로써 작동합니다. 전역 정의를 바꾸면 다중 스레드 된 uwsgi 아래에서이 작업을 실행하기 때문에 프로세스 아래에서 실행되는 모든 스레드에 대한 함수가 대체되므로 tid와 pid가 동일한 경우에만 데코레이터를 활성화하도록 정의했습니다. 여기 :

def disable_tracking(func): 
    #decorator 
    def inner(*args, **kwargs): 
     original_tracker = pascalservice.track.track 
     anon = lambda *args, **kwargs: None 
     tid = lambda : str(current_thread().ident) 
     pid = lambda : str(getpid()) 
     uid = lambda : tid() + pid() 
     current_uid = uid() 
     cache.set(current_uid, True) 
     switcher = lambda *args, **kwargs: anon(*args, **kwargs) if cache.get(uid()) else original_tracker(*args, **kwargs) 
     pascalservice.track.track = switcher 
     result = func(*args, **kwargs) 
     cache.delete(current_uid) 
     pascalservice.track.track = original_tracker 
     return result 
    return inner 

이 장식 기능에 대한 이상한 것은 내가 가끔 충돌을지고있어 내가 조금 틀에 얽매이지 않는 것에 따라 코딩이 스타일이 올바른지 확인하려는 것입니다.

답변

1

당신이하고있는 것을 원숭이 패칭이라고합니다. 완전히 나쁜 습관은 아니지만 종종 버그를 정확히 찾아내는 것이 어렵 기 때문에 신중하게 사용하십시오.

데코레이터가 어떤 이유로 든 필수적이라면 데코레이터의 요청 객체에 플래그를 추가하고 트랙 기능에 해당 플래그의 체크를 추가하는 것이 좋습니다.

데코레이터 : 트랙 기능의

def disable_tracking(func): 
    def wrapper(*args, **kwargs): 
    kwargs["request"].pascalservice_do_not_track = true 
    return func(*args, **kwargs) 
    return wrapper 

시작은 :

if hasattr(request, "pascalservice_do_not_track"): 
    return 
# do the tracking ... 

당신은 또한 당신의보기에서 트랙을 호출 라인을 언급 할 수있다.

+0

답변 해 주셔서 감사합니다. 또한 fyi, 난 그냥 트랙 기능을 주석으로하지만 실제로 그것은보기 내의 여러 다른 기능 내에서 호출되고있다. 이러한 기능은 다른 곳에서 재사용되므로 쉽게 주석을 제거 할 수 없습니다. –