次のような関数のビューがあるとします。
@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() というデコレータを使用しました。主な機能を実行する前に状態をチェックしたいのです。デコレータ関数のコードは次のとおりです。
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 クライアントと Web クライアントからテストします。以下はテスト結果です。
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.デコレータが原因です。*Flask のデコレーター @app.route() は、装飾された関数を記録します。そこで、keep 関数の機能として functools.wraps(f) を追加しました。しかし、プログラムが check_something(check='dog') を実行すると、f(*args, **kwargs) が実行されないため、flask は装飾された関数の機能を失います。そして、フラスコは応答を失います。私は推測する。
2.しかし、なぜ GET は成功を実行できるのでしょうか? Flask と POST の間に問題がある可能性があります。私もそう思います。
誰か助けてくれませんか?ありがとう!