Add sub-app to generate open api spec
This commit is contained in:
0
demo/__init__.py
Normal file
0
demo/__init__.py
Normal file
25
demo/__main__.py
Normal file
25
demo/__main__.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from aiohttp import web
|
||||
|
||||
from aiohttp_pydantic import oas
|
||||
from aiohttp.web import middleware
|
||||
|
||||
from .view import PetItemView, PetCollectionView
|
||||
from .model import Model
|
||||
|
||||
|
||||
@middleware
|
||||
async def pet_not_found_to_404(request, handler):
|
||||
try:
|
||||
return await handler(request)
|
||||
except Model.NotFound as key:
|
||||
return web.json_response({"error": f"Pet {key} does not exist"}, status=404)
|
||||
|
||||
|
||||
app = web.Application(middlewares=[pet_not_found_to_404])
|
||||
oas.setup(app)
|
||||
|
||||
app["model"] = Model()
|
||||
app.router.add_view("/pets", PetCollectionView)
|
||||
app.router.add_view("/pets/{id}", PetItemView)
|
||||
|
||||
web.run_app(app)
|
||||
43
demo/model.py
Normal file
43
demo/model.py
Normal file
@@ -0,0 +1,43 @@
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class Pet(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
|
||||
|
||||
class Model:
|
||||
"""
|
||||
To keep simple this demo, we use a simple dict as database to
|
||||
store the models.
|
||||
"""
|
||||
|
||||
class NotFound(KeyError):
|
||||
"""
|
||||
Raised when a pet is not found.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.storage = {}
|
||||
|
||||
def add_pet(self, pet: Pet):
|
||||
self.storage[pet.id] = pet
|
||||
|
||||
def remove_pet(self, id: int):
|
||||
try:
|
||||
del self.storage[id]
|
||||
except KeyError as error:
|
||||
raise self.NotFound(str(error))
|
||||
|
||||
def update_pet(self, id: int, pet: Pet):
|
||||
self.remove_pet(id)
|
||||
self.add_pet(pet)
|
||||
|
||||
def find_pet(self, id: int):
|
||||
try:
|
||||
return self.storage[id]
|
||||
except KeyError as error:
|
||||
raise self.NotFound(str(error))
|
||||
|
||||
def list_pets(self):
|
||||
return list(self.storage.values())
|
||||
28
demo/view.py
Normal file
28
demo/view.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from aiohttp_pydantic import PydanticView
|
||||
from aiohttp import web
|
||||
|
||||
from .model import Pet
|
||||
|
||||
|
||||
class PetCollectionView(PydanticView):
|
||||
async def get(self):
|
||||
pets = self.request.app["model"].list_pets()
|
||||
return web.json_response([pet.dict() for pet in pets])
|
||||
|
||||
async def post(self, pet: Pet):
|
||||
self.request.app["model"].add_pet(pet)
|
||||
return web.json_response(pet.dict())
|
||||
|
||||
|
||||
class PetItemView(PydanticView):
|
||||
async def get(self, id: int, /):
|
||||
pet = self.request.app["model"].find_pet(id)
|
||||
return web.json_response(pet.dict())
|
||||
|
||||
async def put(self, id: int, /, pet: Pet):
|
||||
self.request.app["model"].update_pet(id, pet)
|
||||
return web.json_response(pet.dict())
|
||||
|
||||
async def delete(self, id: int, /):
|
||||
self.request.app["model"].remove_pet(id)
|
||||
return web.json_response(id)
|
||||
Reference in New Issue
Block a user