2013-11-15 2 views
4

Предположим, есть вид функции выглядит следующим образом:Колба потерял клиента после ответа

@app.route('/cat/', methods=('GET', 'POST')) 
@check_something(check='cat') 
def cat(): 
    print 'cat' 
    return 'cat' 

@app.route('/dog/', methods=('GET', 'POST')) 
@check_something(check='dog') 
def dog(): 
    print 'dog' 
    return 'dog' 

Здесь я использовал декоратор по имени check_something(), то, что я хочу сделать, это проверить состояние до выполнения mainfanction. Код функции декоратор:

def check_something(check=''): 
    def decorator(f): 
     @functools.wraps(f) 
     def decorated_function(*args, **kwargs): 
      print('check_start') 
      if check == 'dog': 
       return jsonify(ret='check dog') 
      else: 
       ctx = f(*args, **kwargs) 
       return jsonify(ret=ctx) 
     return decorated_function 
    return decoration 

Я проверить его от андроида клиента и веб-клиента, ниже приведены результаты испытаний:

Android + GET: route 'cat' is OK, route 'dog' is OK; 
Web + GET : route 'cat' is OK, route 'dog' is OK; 
Android +POST: route 'cat' is OK, route 'dog' is Failed, raise SocketTimeoutException; 
Web + POST: i didn't test it. 

Почему? Это так странно!

Позвольте мне рассказать о некоторых личных спекуляциях.

1.Это вызвано декоратором. * Декоратор фляжки @ app.route() с записью оформленной функции. И поэтому я добавил functools.wraps (f) для сохранения функции функции. Но когда программа выполняет check_something (check = 'dog'), она не выполняла f (* args, ** kwargs), поэтому флажок потерял функцию украшенной функции. И так колба теряет ответ. Я полагаю.

2.Но почему GET может выполнить успех? Возможно, есть какая-то проблема между Flask и POST. Думаю, тоже.

Может ли кто-нибудь помочь? Благодаря!

+3

Просто попробовал GET + POST (сеть), работал нормально. Одна вещь, в функции check_something, самый внешний возврат должен возвращать 'decorator' вместо' decoration'. – jbub

+0

Я не вижу, чтобы вы проверяли метод запроса. («методы» задают только разрешенные методы) http://flask.pocoo.org/docs/0.10/quickstart/#http-methods – Maarten

ответ

0

Я думаю, что в вашем декораторе есть ошибка. f является выполняемой функцией, и если - это тест f, не выполняется. скорректированная версия:

print('check_start') 
if check == 'dog': 
     ctx = f(*args, **kwargs) 
     return jsonify(ret='check dog') 
else: 
     ctx = f(*args, **kwargs) 
     return jsonify(ret=ctx 
Смежные вопросы