2017-12-29 70 views
3

を失わずに包まれた関数に第2の戻り値を追加しますが、応答関数は次のようにラップされソースしますエントリポイント:サードパーティ製のフレームワークでは、下位互換性

@wrap_function 
def hello(): 
    return '<b>Hello</b>' 

フレームワークは応答を作成して送信しますが、この機能は「フードの下に」隠されています。

これで、Responseというクッキーなどのパラメータを自分の関数helloから設定する必要があります。ラッパーの変更がなければ不可能と思われるので、私はフレームワークに貢献することにしました。

私は最初に、ラップされた関数(hello)から任意の値を応答パラメータで返してから、add_contextの中で解析しました。後方互換性が重要であることに注意してください。 "古いスタイルの"関数は応答パラメータとともに "new"と同様に機能するはずです。だから、helloと一緒に、ラッパーはこのような機能をサポートする必要があります:

@wrap_function 
def ping(): 
    return '<b>Hello</b>', {'cookies': [('te', 'st')]} 

しかし、私のためとして、それは間違いなくハックの仕事です。おそらく、互換性を失うことなく、ラップされた関数の戻り値を変更するために、そのような変更やより良いアプローチを実装するためのベストプラクティスがありますか?

答えて

0

最後に、シンプルで柔軟な方法をとることにしました。ラップされた関数は、いつものようにマークダウンを返すか、Responseオブジェクトをmarkdownボディで初期化します。そして、ラッパーの内部で、isinstanceに基づいて実行された異なるアクション。

from flask import Response 

def wrap_func(func): 
    def add_context(*args, **kwargs): 
     output_value = func(*args, **kwargs) 

     if isinstance(output_value, Response): 
      return output_value 
     else: 
      return Response(
       output_value 
      ) 

    return add_context 

この最小限の例外のラッパーはそれがResponseに基づいCustomResponseを作成し、必要なアクションを再定義した後に動作し、レスポンスボディを変更する必要がありますが。