69 lines
2.1 KiB
Markdown
69 lines
2.1 KiB
Markdown
|
|
# Routes
|
||
|
|
|
||
|
|
OhMyAPI uses [FastAPI](https://fastapi.tiangolo.com/) - a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints.
|
||
|
|
|
||
|
|
Routes are exposed via a module named `routes` in the app's directory.
|
||
|
|
OhMyAPI auto-detects all `fastapi.APIRouter` instances exposed this way.
|
||
|
|
If the `routes` module is a package, OhMyAPI will search through its submodules recursively.
|
||
|
|
|
||
|
|
When creating an app via `startapp`, OhMyAPI will provide CRUD boilerplate to help your get started.
|
||
|
|
|
||
|
|
## Example CRUD API endpoints
|
||
|
|
|
||
|
|
```python
|
||
|
|
from ohmyapi.db.exceptions import DoesNotExist
|
||
|
|
|
||
|
|
from ohmyapi.router import APIRouter, HTTPException, HTTPStatus
|
||
|
|
|
||
|
|
from .models import Restaurant
|
||
|
|
|
||
|
|
from typing import List
|
||
|
|
|
||
|
|
router = APIRouter(prefix="/restaurant", tags=['restaurant'])
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/", response_model=List[Restaurant])
|
||
|
|
async def list():
|
||
|
|
"""List all restaurants."""
|
||
|
|
queryset = Restaurant.all()
|
||
|
|
schema = Restaurant.Schema()
|
||
|
|
return await schema.from_queryset(queryset)
|
||
|
|
# or in one line:
|
||
|
|
# return await Restaurant.Schema().from_queryset(Restaurant.all())
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/", status_code=HTTPStatus.CREATED)
|
||
|
|
async def post(restaurant: Restaurant.Schema(readonly=True)):
|
||
|
|
"""Create a new restaurant."""
|
||
|
|
return await Restaurant(**restaurant.model_dump()).create()
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/{id}", response_model=Restaurant)
|
||
|
|
async def get(id: str):
|
||
|
|
"""Get restaurant by ID."""
|
||
|
|
return await Restaurant.Schema().from_queryset(Restaurant.get(id=id))
|
||
|
|
|
||
|
|
|
||
|
|
@router.put("/{id}", status_code=HTTPStatus.ACCEPTED)
|
||
|
|
async def put(restaurant: Restaurant):
|
||
|
|
"""Update restaurant."""
|
||
|
|
try:
|
||
|
|
db_restaurant = await Restaurant.get(id=id)
|
||
|
|
except DoesNotExist:
|
||
|
|
return HTTPException(status_code=HTTPStatus.NOT_FOUND)
|
||
|
|
|
||
|
|
db_restaurant.update_from_dict(restaurant.model_dump())
|
||
|
|
return await db_restaurant.save()
|
||
|
|
|
||
|
|
|
||
|
|
@router.delete("/{id}", status_code=HTTPStatus.ACCEPTED)
|
||
|
|
async def delete(id: str):
|
||
|
|
try:
|
||
|
|
db_restaurant = await Restaurant.get(id=id)
|
||
|
|
except DoesNotExist:
|
||
|
|
return HTTPException(status_code=HTTPStatus.NOT_FOUND)
|
||
|
|
|
||
|
|
return await db_restaurant.delete()
|
||
|
|
|
||
|
|
```
|