From 20313358c3b27b60d065bd8ae8897f9638df9d51 Mon Sep 17 00:00:00 2001 From: pengtao Date: Mon, 21 Jun 2021 12:07:23 +0800 Subject: [PATCH] base model --- __init__.py | 0 dependencies.py | 12 +++++++++ internal/__inti__.py | 0 internal/admin.py | 7 +++++ main.py | 64 ++++++++++++++++++++++++++++++++++++++++++++ routers/__init__.py | 0 routers/items.py | 32 ++++++++++++++++++++++ routers/users.py | 17 ++++++++++++ 8 files changed, 132 insertions(+) create mode 100644 __init__.py create mode 100644 dependencies.py create mode 100644 internal/__inti__.py create mode 100644 internal/admin.py create mode 100644 main.py create mode 100644 routers/__init__.py create mode 100644 routers/items.py create mode 100644 routers/users.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dependencies.py b/dependencies.py new file mode 100644 index 0000000..82d02a5 --- /dev/null +++ b/dependencies.py @@ -0,0 +1,12 @@ +from fastapi import Header, HTTPException + + +async def get_token_header(x_token: str = Header(...)): + if x_token != "fake-super-scret-token": + raise HTTPException(status_code=400, detail="X-Token header invalid") + + +async def get_query_token(token: str): + if token != "jessica": + raise HTTPException( + status_code=400, detail="No Jessica token provided") diff --git a/internal/__inti__.py b/internal/__inti__.py new file mode 100644 index 0000000..e69de29 diff --git a/internal/admin.py b/internal/admin.py new file mode 100644 index 0000000..06c8f9c --- /dev/null +++ b/internal/admin.py @@ -0,0 +1,7 @@ +from fastapi import APIRouter +router = APIRouter() + + +@router.post("/") +async def update_admin(): + return {"message": "Admin getting schwifty"} diff --git a/main.py b/main.py new file mode 100644 index 0000000..d680271 --- /dev/null +++ b/main.py @@ -0,0 +1,64 @@ +# cd .. && uvicorn myops.main:app --reload +from fastapi import Depends, FastAPI, BackgroundTasks +from .dependencies import get_query_token, get_token_header +from .routers import items, users +from .internal import admin +from typing import Optional + +tags_metadata = [ + { + "name": "users", + "description": "Operations with users. The **login** logic is also here.", + }, + { + "name": "items", + "description": "Manage items. So _fancy_ they have their own docs.", + "externalDocs": { + "description": "Items external docs", + "url": "https://fastapi.tiangolo.com/", + }, + }, +] + +# app = FastAPI(dependencies=[Depends(get_token_header)], title="My ops project", +# description="This is some interface for ops in kingsome!", version="1.0.1") + + +app = FastAPI(dependencies=[Depends(get_token_header)], + openapi_tags=tags_metadata) + + +app.include_router(users.router) +app.include_router(items.router) +app.include_router( + admin.router, + prefix="/admin", + tags=["admin"], + dependencies=[Depends(get_token_header)], + responses={418: {"description": "I`m a teapot"}} +) + +app.get("/") + + +async def root(): + return {"message": "Hello Bigger Applications!"} + + +def write_log(message: str): + with open("log.txt", mode="a") as log: + log.write(message) + + +def get_query(background_tasks: BackgroundTasks, q: Optional[str] = None): + if q: + message = f"found query:{q}\n" + background_tasks.add_task(write_log, message) + return q + + +@app.post("/send-notification/{email}") +async def send_notification(email: str, background_tasks: BackgroundTasks, q: str = Depends(get_query)): + message = f"message to {email} \n" + background_tasks.add_task(write_log, message) + return {"message": "Message sent"} diff --git a/routers/__init__.py b/routers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/items.py b/routers/items.py new file mode 100644 index 0000000..436cc1d --- /dev/null +++ b/routers/items.py @@ -0,0 +1,32 @@ +from fastapi import APIRouter, Depends, HTTPException +from ..dependencies import get_token_header + +router = APIRouter( + prefix="/items", + tags=["item"], + dependencies=[Depends(get_token_header)], + responses={404: {"description": "Not found"}}, + +) + +fake_item_db = {"plumbus": {"name": "Plumbus", "gun": {"name": "Portal Gun"}}} + + +@router.get("/") +async def read_items(): + return fake_item_db + + +@router.get("/{itemid}") +async def read_item(item_id: str): + if item_id not in fake_item_db: + raise HTTPException(status_code=404, detail="Item not found") + return {"name": fake_item_db[item_id]["name"], "item_id": item_id} + + +@router.put("/{item_id}", tags=["custom"], responses={403: {"description": "Operation forbidden"}}) +async def update_item(item_id: str): + if item_id != "pulmbus": + raise HTTPException( + status_code=403, detail="You can only update the item plumbus") + return {"item_id": item_id, "name": "The great plumbus"} diff --git a/routers/users.py b/routers/users.py new file mode 100644 index 0000000..9a15ceb --- /dev/null +++ b/routers/users.py @@ -0,0 +1,17 @@ +from fastapi import APIRouter +router = APIRouter() + + +@router.get('/users/', tags=["users"]) +async def read_users(): + return [{"username": "Rick"}, {"username": "Morty"}] + + +@router.get("/user/me", tags=["users"]) +async def read_user_me(): + return {"username": "fakecurrentuser"} + + +@router.get("/user/{username}", tags=["users"]) +async def read_user(username: str): + return {"username": username}