2017-03-09 11 views
1

私はHTTP経由で完全にWORKDフラスコ法があります:私はコードから、このようなメソッドを呼び出すようにしようとした場合しかし、このhttp://localhost:8080/price/21/?period=1&duration=60httpコールを使わずにwebargsメソッドに引数を直接渡す方法は?

などの呼び出しと

class PricePerPeriod(Resource): 

    args = {'period': fields.Int(required=True, validate=lambda val: val > 0), 
      'duration': fields.Int(required=True, validate=lambda val: val > 0)} 

    @use_kwargs(args) 
    def get(self, identifier_id, period, duration): 

api.add_resource(PricePerPeriod, '/price/<int:identifier_id>/')

を:

​​

webargsによる引数チェックで失敗します。

{"errors": { 
    "period": [ 
     "Missing data for required field." 
    ] 
}} 

Iのみ@use_kwargs(引数)が引数をパラメータは直接関数に渡されるようにダイレクトコールの場合に空である、に充填されることを期待すると仮定することができます。

@use_kwargs(args)で装飾されたメソッドをコードから呼び出して、引数に正しく渡すにはどうすればよいですか?

答えて

1

フラスコバインディングをビジネスロジックと分離しておくことが賢明です。これは、第三者のフレームワークまたはライブラリへのあらゆるバインディングの場合です。あなたのいない人は、常に第三者のものと「汚染された」方法のいくつかで終わるでしょう。

私は@use_kwargsデコレータを使わずにgetメソッドを実装し、フラスコに依存しないクラスを作成することをお勧めします。

このクラスのオブジェクトは、同じで装飾されたメソッドを持つフラスコバインディングオブジェクトにラップされます。

このようにして、あなたは自分のロジックを設計した方法で柔軟に対応し、懸念事項を明確に分離できます。

class FlaskBinding: 
    def _init_(self): 
    self.obj = PricePerPeriod() 

    @use_kwargs 
    def get(self,...): 
    return self.obj.get() 
+0

Soudnsは合理的でクリーンです。ありがとう! – uzla

関連する問題