Skip to content

Commit f411a82

Browse files
committed
fastapi response models
1 parent 899905f commit f411a82

File tree

2 files changed

+180
-0
lines changed

2 files changed

+180
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
from typing import Optional, Union, List, Dict
2+
3+
from fastapi import FastAPI
4+
from pydantic import BaseModel, EmailStr
5+
6+
7+
app = FastAPI()
8+
9+
10+
# class UserIn(BaseModel):
11+
# username: str
12+
# password: str
13+
# email: EmailStr
14+
# full_name: Optional[str] = None
15+
#
16+
#
17+
# class UserOut(BaseModel):
18+
# username: str
19+
# email: EmailStr
20+
# full_name: Optional[str] = None
21+
#
22+
#
23+
# class UserInDB(BaseModel):
24+
# username: str
25+
# hashed_password: str
26+
# email: EmailStr
27+
# full_name: Optional[str] = None
28+
29+
30+
class UserBase(BaseModel):
31+
username: str
32+
email: EmailStr
33+
full_name: Optional[str] = None
34+
35+
36+
class UserIn(UserBase):
37+
password: str
38+
39+
40+
class UserOut(UserBase):
41+
pass
42+
43+
44+
class UserInDB(UserBase):
45+
hashed_password: str
46+
47+
48+
class BaseItem(BaseModel):
49+
description: str
50+
type: str
51+
52+
53+
class CarItem(BaseItem):
54+
type = 'car'
55+
56+
57+
class PlaneItem(BaseItem):
58+
type = 'plane'
59+
size: int
60+
61+
62+
items = {
63+
"item1": {"description": "All my friends drive a low rider", "type": "car"},
64+
"item2": {
65+
"description": "Music is my aeroplane, it's my aeroplane",
66+
"type": "plane",
67+
"size": 5,
68+
},
69+
}
70+
71+
72+
class Item(BaseModel):
73+
name: str
74+
description: str
75+
76+
77+
items2 = [
78+
{"name": "Foo", "description": "There comes my hero"},
79+
{"name": "Red", "description": "It's my aeroplane"},
80+
]
81+
82+
83+
def fake_password_hasher(raw_password: str):
84+
return 'supersecret' + raw_password
85+
86+
87+
def fake_save_user(user_in: UserIn):
88+
hashed_password = fake_password_hasher(user_in.password)
89+
user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)
90+
print('User saved! ..not really')
91+
return user_in_db
92+
93+
94+
@app.post('/user/', response_model=UserOut)
95+
async def create_user(user_in: UserIn):
96+
user_saved = fake_save_user(user_in)
97+
return user_saved
98+
99+
100+
@app.get('/items/{item_id}', response_model=Union[PlaneItem, CarItem])
101+
async def read_item(item_id: str):
102+
return items[item_id]
103+
104+
105+
@app.get('/items/', response_model=List[Item])
106+
async def read_items():
107+
return items2
108+
109+
110+
@app.get('/keyword-weights/', response_model=Dict[str, float])
111+
async def read_keyword_weights():
112+
return {'foo': 2.3, 'bar': 4.5}
113+
114+
115+
# PYTHONPATH=module_fastapi uvicorn fastapi_extra_models:app --reload
116+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from typing import Optional, List
2+
3+
from fastapi import FastAPI
4+
from pydantic import BaseModel, EmailStr
5+
6+
app = FastAPI()
7+
8+
9+
class Item(BaseModel):
10+
name: str
11+
description: Optional[str] = None
12+
price: float
13+
tax: float = 10.5
14+
tags: List[str] = []
15+
16+
17+
items = {
18+
"foo": {"name": "Foo", "price": 50.2},
19+
"bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2},
20+
"baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": []},
21+
}
22+
23+
24+
class UserIn(BaseModel):
25+
username: str
26+
password: str
27+
email: EmailStr
28+
full_name: Optional[str] = None
29+
30+
31+
class UserOut(BaseModel):
32+
username: str
33+
email: EmailStr
34+
full_name: Optional[str] = None
35+
36+
37+
@app.post('/items/', response_model=Item)
38+
async def create_item(item: Item):
39+
return item
40+
41+
42+
@app.get(
43+
'/items/{item_id}',
44+
response_model=Item,
45+
response_model_exclude_unset=True,
46+
# response_model_exclude_defaults=True,
47+
# response_model_exclude_none=True,
48+
# response_model_include={'name'},
49+
# response_model_exclude={'name'},
50+
)
51+
async def read_item(item_id: str):
52+
return items[item_id]
53+
54+
55+
@app.post('/user/', response_model=UserIn)
56+
async def create_user(user: UserIn):
57+
return user
58+
59+
60+
@app.post('/user2/', response_model=UserOut)
61+
async def create_user2(user: UserIn):
62+
return user
63+
64+
# PYTHONPATH=module_fastapi uvicorn fastapi_response_model:app --reload

0 commit comments

Comments
 (0)