2014-11-21 82 views
0

我有以下装饰:为什么这个装饰器被多次调用?

@acceptable_methods('POST') 
def deposit_funds(request, user=None): 
    # do something 

这里是装饰代码:

def acceptable_methods(*args): 
    """ 
    Enforce that the necessary method has been called. 

    """ 
    valid_methods = args 
    print '11111' 

    def _method_wrapper(view_function): 
     print '22222' 

     def _arguments_wrapper(*args, **kwargs): 
      print '33333' 
      if args[0].META.get('REQUEST_METHOD') not in valid_methods: 
       return JsonRestResponse(None, success=False, error="This is not an acceptable method", status_code=FORBIDDEN_METHOD) 
      return view_function(*args, **kwargs) 

     return _arguments_wrapper 

    return _method_wrapper 

一些非常斯特朗的原因,似乎双方的外包装纸的运行16次。以下是打印报表:

[21/Nov/2014 16:26:57] "POST /api/v1.0/bonuses/grant HTTP/1.1" 500 124805 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
11111 
22222 
[21/Nov/2014 16:27:13] "POST /api/v1.0/bonuses/grant HTTP/1.1" 500 66364 

每个打印语句都有相同的os.pid()。 这是为什么发生?任何为什么不是最内在的方法被调用?

+0

这是一个WSGI应用程序吗?你检查过你的WSGI *服务器*加载过程吗?你有没有设置它来加载多个进程来处理负载? – 2014-11-21 16:29:42

+0

你应该打印到stderr而不是stdout,以便日志记录可以正常工作(并且不会像以后那样炸毁诸如mod_wsgi之类的东西)。 – 2014-11-21 16:29:50

回答

3

您的WSGI服务器创建了16个子进程,并且Python正在为每个进程分别运行。

+0

为什么?我有其他包装不这样做。我认为这是一个自我引用循环的问题。 – David542 2014-11-21 16:32:42

+0

@ David542:这不是这种情况,因为这是在导入时运行的代码。此时,代码最多导入一次(如果这是导入自身的控制台脚本,则导入两次)。 – 2014-11-21 16:33:50

+0

@ David542:除非你遗漏了一些上下文,并且这段代码在另一个函数中运行,并且你一次又一次地调用该函数。 – 2014-11-21 16:34:44

相关问题