많은 뷰에서 사용되는 파이썬 함수가 있습니다. 특히 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
이 장식 기능에 대한 이상한 것은 내가 가끔 충돌을지고있어 내가 조금 틀에 얽매이지 않는 것에 따라 코딩이 스타일이 올바른지 확인하려는 것입니다.
답변 해 주셔서 감사합니다. 또한 fyi, 난 그냥 트랙 기능을 주석으로하지만 실제로 그것은보기 내의 여러 다른 기능 내에서 호출되고있다. 이러한 기능은 다른 곳에서 재사용되므로 쉽게 주석을 제거 할 수 없습니다. –