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() というデコレータを使用しました。主な機能を実行する前に状態をチェックしたいのです。デコレータ関数のコードは次のとおりです。

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 の間に問題がある可能性があります。私もそう思います。

誰か助けてくれませんか?ありがとう!

4

1 に答える 1