main-memory-fastAPI.py#
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn # for custom run only
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
app = FastAPI()
_d = {}
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
# return {"item_id": item_id, "q": q}
return _d[item_id]
import json
class ItemEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Item):
return {
'name': obj.name,
'price': obj.price,
'is_offer': obj.is_offer
}
return super().default(obj)
@app.get("/items-all")
async def get_all():
return json.dumps(_d, cls=ItemEncoder)
from datetime import datetime
from copy import deepcopy
@app.put("/items/{item_id}")
async def update_item(item_id, item: Item):
# Do something with backend... then return
# return {"item_name": item.name, "item_id": item_id, "updated_date": datetime.now()}
if item_id not in _d:
raise Exception(f"Item Id: {item_id} is not found")
updated_item = deepcopy(item)
updated_item.updated_datetine = datetime.now()
_d[item_id] = updated_item
return updated_item
@app.post("/item")
async def add_item(item: Item):
# Do something with backend... then return
# return {"item_name": item.name, "item_id": item_id, "updated_date": datetime.now()}
item_id = len(_d) + 1
_d[item_id] = item
return _d[item_id]
# Test Header
from fastapi import Header
@app.get("/item-header")
def read_items(user_agent: str = Header(None)):
print("AAA", user_agent)
return {"User-Agent": user_agent}
@app.get("/item-header2")
def read_items(x_token: str = Header(...)):
return {"X-Ttoken": x_token}
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=8000)