2015-09-28 8 views
6

Was ist der richtige Ansatz klassenbasierte Handler anstelle von Funktionen in aiohttp Bibliothek zu benutzen? Ich bin zum Schreiben Handler verwendet als Klassen in Django so frage ich mich, wie man es richtig in aiohttp zu tun?klassenbasierte Ansichten in aiohttp

Antwort

5

Ich nehme an, Sie möchten Klassen-basierte Handler für die Anwendung der Vererbung für die Wiederverwendung von Code verwenden.

Technisch aiohttp Web-Handler ist jede Koroutine die Anforderungsparameter und gibt Antwort Instanz akzeptiert.

Zum Beispiel

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

    @asyncio.coroutine 
    def __call__(self, request): 
     return web.Response() 

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

kann zur Herstellung von Web-Handler Hierarchie als Basisklasse verwendet werden.

Oder sogar

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

    @asyncio.coroutine 
    def get_from_db(self, data): 
     ... 

    @asyncio.coroutine 
    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)) 

    @asyncio.coroutine 
    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) 
+2

immer noch nicht auf die Idee kommen, wie Post (Anfrage) Funktion zum Beispiel hinzuzufügen. Sollte ich die Methode as_view() implementieren, die in URLs – vwvolodya

+0

verwendet wird, habe ich ein Beispiel für die Registrierung einer Instanz hinzugefügt. Der Code nicht BaseView für jede Anfrage neu erstellen - ich habe festgestellt, dass nicht erforderlich ist, in der Regel verwenden wir Ansatz mit 'Handle'-Klasse sehr gut. –

+1

Update: Eine neuere Version hinzugefügt [Class Based Views] (https://aiohttp.readthedocs.org/en/stable/web.html#class-based-views). Beachten Sie, dass es Komplikationen gibt, nicht alle "aio-libs" unterstützen es vollständig – nerdwaller