Skip to content

Instantly share code, notes, and snippets.

@Atheuz
Created June 22, 2019 07:33
Show Gist options
  • Save Atheuz/075f4d8fe3b56d034741301ba2574ef1 to your computer and use it in GitHub Desktop.
Save Atheuz/075f4d8fe3b56d034741301ba2574ef1 to your computer and use it in GitHub Desktop.
from fastapi import FastAPI, Depends, Query
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
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 DataclassArgs:
dt: datetime.datetime = ...
to_sum: List[int] = Query(None)
@app.get("/api/v1/ping_dataclass", tags=["basic"])
def ping_dataclass(args: DataclassArgs = Depends(DataclassArgs)):
"""Args defined in a dataclass. Works."""
return JSONResponse(
status_code=starlette.status.HTTP_200_OK,
content={"detail": "pong", "dt": args.dt.isoformat(), "summed": sum(x for x in args.to_sum) if args.to_sum else 0},
)
class PydanticArgs(BaseModel):
dt: datetime.datetime = ...
to_sum: List[int] = Query(None)
@app.get("/api/v1/ping_pydantic", tags=["basic"])
def ping_pydantic(args: PydanticArgs = Depends(PydanticArgs)):
"""Args defined in a pydantic model. Does not work."""
return JSONResponse(
status_code=starlette.status.HTTP_200_OK,
content={"detail": "pong", "dt": args.dt.isoformat(), "summed": sum(x for x in args.to_sum) if args.to_sum else 0},
)
class ClassArgs:
def __init__(self, dt: datetime.datetime, to_sum: List[int] = Query(None)):
self.dt = dt
self.to_sum = to_sum
@app.get("/api/v1/ping_class", tags=["basic"])
def ping_class(args: ClassArgs = Depends(ClassArgs)):
"""Args defined in a class. Works."""
return JSONResponse(
status_code=starlette.status.HTTP_200_OK,
content={"detail": "pong", "dt": args.dt.isoformat(), "summed": sum(x for x in args.to_sum) if args.to_sum else 0},
)
@app.get("/api/v1/ping_params", tags=["basic"])
def ping_params(dt: datetime.datetime, to_sum: List[int] = Query(None)):
"""Args defined in argument list. Works."""
return JSONResponse(
status_code=starlette.status.HTTP_200_OK,
content={"detail": "pong", "dt": dt.isoformat(), "summed": sum(x for x in to_sum) if to_sum else 0},
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment