Предположим, есть вид функции выглядит следующим образом:Колба потерял клиента после ответа
@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. Думаю, тоже.
Может ли кто-нибудь помочь? Благодаря!
Просто попробовал GET + POST (сеть), работал нормально. Одна вещь, в функции check_something, самый внешний возврат должен возвращать 'decorator' вместо' decoration'. – jbub
Я не вижу, чтобы вы проверяли метод запроса. («методы» задают только разрешенные методы) http://flask.pocoo.org/docs/0.10/quickstart/#http-methods – Maarten