2017-07-10 7 views
1

Ich versuche, eine REST-API-Anwendung für ein Python 3-asyncio-Programm mit der aiohttp-Bibliothek zu erstellen.asyncio REST API dynamisches Routing

In diesem Programm verwalte ich Objekte, bestehend aus mehr Objekte, zum Beispiel Verwaltung von Kunden Warenkorb, enthält viele verschiedene Produkte.

Beim Hinzufügen eines neuen Objekts (Produkt) zu einem Container (Einkaufswagen), Ich möchte für es eine Unteranwendung mit einzigartigen Funktionen, zum Beispiel haben Milchprodukte Ablaufdatum und Getränke haben Alkoholgehalt.

Das Problem ist, dass die verschiedenen Wege unterschiedlicher Produkte in verschiedenen Teilanwendungen gelöst werden muss, zum Beispiel: wenn sich unsere Wege-Format ist: /{cart_id}/{product_name} dann:

/1/milk -> Muss in die Dairy-Unteranwendung aufgelöst werden, während

/1/whiskey -> zu der Getränke-Unteranwendung aufgelöst werden muss.

Ich möchte auch, dass die Unteranwendung Zugriff auf den Wert {cart_id} hat.

Insgesamt würde es nur etwa 3 dieser Unteranwendungstypen geben, so dass keine sehr komplizierte Lösung benötigt wird.

Ich plane derzeit über das Überschreiben der aiohttp.Router Klasse, um es vor dem Einfrieren zu deaktivieren, um das dynamische Hinzufügen von Routen zu ermöglichen, , aber das ist ziemlich schrecklich.

Wenn jemand auf ein ähnliches Problem gestoßen ist oder mich auf eine bessere Lösung hinweisen könnte, wäre das sehr hilfreich.

Antwort

1

Sie haben Recht, dass das Überschreiben des Routers zum Deaktivieren des Einfrierens eine schlechte Idee ist.

Besser, Ihre eigenen benutzerdefinierten Routing zu tun. Z.B. eine Ansicht, die alle Anfragen empfängt und dann entscheidet, welche andere Ansicht sich mit jeder Anfrage befassen soll.

Werfen Sie einen Blick auf Custom Routing Criteria in der Dokumentation.

+0

Diese Lösung eignet sich nur für einen einzigen Pfad, ich möchte etwas haben, um verschiedene Sätze von Pfaden für verschiedene Arten von Produkten zu ermöglichen. – roundmilf

+0

Sie können dies immer noch mit anderen Pfaden tun, verwenden Sie einfach [Variablen] (http://aiohttp.readthedocs.io/en/stable/web.html#variable-resources) im Pfad für die Router-Ansicht. – SColvin

+0

Danke! funktioniert perfekt – roundmilf