2017-09-24 95 views
0

我有一个python在许多视图中使用的函数。特别是它在一个运行在uwsgi下的django应用程序中。该功能只是将跟踪数据激发到我们的数据库中。我想创建一个装饰器来禁用该函数,以便对包含该函数的视图进行特定的调用。基本上是:Python装饰器,以禁用某些功能崩溃

@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

感谢您的回答。另外,我只是注释掉轨迹函数,但实际上它在视图内的多个其他函数内被调用。这些功能在其他地方重复使用,因此无法准确评论,很容易将其删除。 –