2017-12-05 27 views
1

私のaiohttpミドルウェアは、ルートに渡されたバインドされたメソッドではなく、パラメータとして機能を取得します。この行動を説明するには?それを避ける方法は?ハンドラはクラスに編成され、経路に渡された場合はaiohttpは暗黙的に私のメソッドを機能させます

class AsyncHttpServer: 

    def __init__(self, host=None, port=None, loop=None, conf_path=None): 
     self.loop = loop 
     self.conf_path = conf_path 
     self.host = host 
     self.port = port 
     self.loop = loop 
     self.app = web.Application(
      middlewares=[ 
       preprocess_request, 
      ] 
     ) 

    def serve_forever(self): 

     with RequestHandler(self.conf_path) as handler: 
      print(handler.search) # bound method 'search'. Instance is irrelevant 
      self.app.router.add_routes([     
       web.post('/search', handler.search, name='search'),     
      ]) 
      try: 
       web.run_app(self.app, port=self.port, host=self.host, loop=self.loop) 
      except KeyboardInterrupt: 
       pass 

@asyncio.coroutine 
@middleware 
def preprocess_request(request, handler): 
    print(handler) # function 'search' 
+0

これはasyncio.coroutineの動作方法です。 –

+0

あなたはaiohttpが援助なしにコルーチンのデコレータにミドルウェアをラップすることを意味しますか?私はあなたの貢献に対して「ありがとう」と言う機会をとる。 – VadimFilin

+0

あなたの例を見てください。 '@ asyncio.coroutine'デコレータで' preprocess_request'を明示的にラップしました。 –

答えて

2

partial.wrapsを使用してデコレータとそれらのハンドラをラップし、通常の機能のようにそれを作るaiohttp。したがって、この関数をオブジェクトメソッドとして直接使用することは不可能です。

彼らだけアンラッピング後の方法として使用することができる。

with RequestHandler(self.conf_path) as handler: 
     self.app["handler"] = handler 

及びてもよい。それはプロトコルをMutableMappingたため

handler.__wrapped__.__self__ 

またはハンドラクラスweb.Application()値として渡すことができます

class_handler = request.app["handler"] 
関連する問題