2014-11-21 5 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 * загружает процессы? Вы настроили его для загрузки нескольких процессов для обработки нагрузки? –

+0

Вы должны печатать на stderr, а не на stdout, чтобы журнал мог работать правильно (и чтобы вы не взорвали такие вещи, как mod_wsgi после). –

ответ

3

Ваш сервер WSGI создал 16 дочерних процессов, а Python запускается отдельно для каждого.

+0

Почему? У меня есть другие обертки, которые этого не делают. Я думаю, что это вопрос цикла саморегуляции. – David542

+0

@ David542: Это не так, потому что это код запуска во время импорта. В этот момент код импортируется не чаще одного раза (дважды, если это импорт скрипта скрипта). –

+0

@ David542: если вы не опустили какой-либо контекст, и этот код запускается внутри другой функции, и вы вызываете эту функцию снова и снова. –

Смежные вопросы