Skip to content

Instantly share code, notes, and snippets.

@LasseGravesen
Created June 29, 2019 21:55
Show Gist options
  • Save LasseGravesen/8f5c2f510aa419592bf4fe4568db0ae2 to your computer and use it in GitHub Desktop.
Save LasseGravesen/8f5c2f510aa419592bf4fe4568db0ae2 to your computer and use it in GitHub Desktop.
from fastapi import FastAPI, Depends, Query, Body
from starlette.requests import Request
from starlette.responses import JSONResponse
import starlette.status
from pydantic import BaseModel, validator
import datetime
from typing import List
from dataclasses import dataclass, field, asdict
app = FastAPI(
title="testapi",
version="1.0.0",
openapi_url="/api/v1/openapi.json",
docs_url="/api/v1/docs",
redoc_url="/api/v1/redocs",
)
@dataclass
class UserDataclass:
username: str = Body(None)
age: int = Body(None)
demo: bool = Query(False)
token: str = Query(None)
@app.post("/api/v1/user_dataclass", tags=["basic"])
def ping_dataclass(user: UserDataclass = Depends(UserDataclass)):
"""Args defined in a dataclass. Kinda broken."""
return JSONResponse(
status_code=starlette.status.HTTP_200_OK,
content={"detail": "pong", "user": asdict(user)},
)
@dataclass
class SearchArgs:
query: str = Query(...)
limit: int = Query(10)
offset: int = Query(0)
sort: str = Query("date")
@app.get("/api/v1/search_dataclass", tags=["basic"])
def search(args: SearchArgs = Depends(SearchArgs)):
return JSONResponse(
status_code=starlette.status.HTTP_200_OK,
content={"detail": "search-result", "args": asdict(args), "results": {"abc": "def"}}
)
@dataclass
class UserDataclass2:
username: str = Body(None)
age: int = Body(None)
@dataclass
class ExtraParams:
demo: bool = Query(False)
token: int = Query(None)
@app.post("/api/v1/user_dataclass2", tags=["basic"])
def ping_dataclass2(user: UserDataclass2 = Depends(UserDataclass2), extra_params: ExtraParams = Depends(ExtraParams)):
"""Args defined in two models."""
return JSONResponse(
status_code=starlette.status.HTTP_200_OK,
content={"detail": "pong", "user": asdict(user)},
)
class UserPydantic(BaseModel):
username: str = ...
age: int = ...
@app.post("/api/v1/ping_pydantic", tags=["basic"])
def ping_pydantic(user: UserPydantic, demo: bool = Query(False), token: str = Query(None)):
"""Args defined in a pydantic model. Does not work."""
return JSONResponse(
status_code=starlette.status.HTTP_200_OK,
content={"detail": "pong", "user": user.dict()},
)
class UserPydantic2(BaseModel):
username: str = Body(None)
age: int = Body(None)
demo: bool = Query(False)
token: str = Query(None)
@app.post("/api/v1/ping_pydantic2", tags=["basic"])
def ping_pydantic2(user: UserPydantic2):
"""Args defined in a pydantic model."""
return JSONResponse(
status_code=starlette.status.HTTP_200_OK,
content={"detail": "pong", "user": user.dict()},
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment