9

aiohttpライブラリで関数の代わりにクラスベースのハンドラーを使用する正しいアプローチは何ですか? 私はDjangoでハンドラーをクラスとして記述することに慣れているので、 aiohttpで正しく行う方法を知りたいですか?

4

3 に答える 3

8

コードを再利用するために継承を適用​​するために、クラスベースのハンドラーを使用したいと思います。

技術的に aiohttp web-handler は、リクエスト パラメータを受け取り、レスポンス インスタンスを返す任意のコルーチンです。

例えば

class BaseView:
    def __init__(self, ...):
        ...

    async def __call__(self, request):
        return web.Response()

app.router.add_route('GET', '/', BaseView(...))

Web ハンドラー階層を作成するための基本クラスとして使用できます。

あるいは

class Handler:
    def __init__(self, db):
        self._db = db

    async def get_from_db(self, data):
        ...

    async def handle_a(self, request):
        data = yield from self.get_from_db(
            self.extract_from_request_a(request))
        return web.Response(self.format_data(data))

    async def handle_b(self, request):
        data = yield from self.get_from_db(
            self.extract_from_request_b(request))
        return web.Response(self.format_data(data))


handler = Handler(db)
app.router.add_route('GET', '/a', hadndler.handle_a)
app.router.add_route('GET', '/b', hadndler.handle_b)
于 2015-09-28T14:44:40.373 に答える
4

次のように使用できます。

from aiohttp import web
from datetime import datetime


class TokenView(web.View):

    async def get(self):
        token = datetime.now().strftime("%Y%m%d%H%M%S")
        room = self.request.match_info.get("room", None)
        return web.json_response({"room": room, "token": token, "result": "OK"})

    async def post(self):
        room = self.request.match_info.get("room", None)
        token = datetime.now().strftime("%Y%m%d%H%M%S")
        return web.json_response({"room": room, "token": token, "result": "OK"})


if __name__ == "__main__":

    app = web.Application()
    app.router.add_view("/token/{room}", TokenView)
    print(app.router.named_resources())
    web.run_app(app)
于 2019-05-26T03:30:47.693 に答える