Dynamic enum with FastApi

Sometimes you need dynamic enumerations, such as some selector options from  database, but you will find that it seems like an the enumeration can only be modified at app startup. Try this:

from random import randint
from fastapi import FastAPI
from enum import Enum
app = FastAPI()
class DynamicEnum(Enum):
pass
@app.get("/")
async def root(e: DynamicEnum):
return {"e": e}
@app.get("/rand-enum")
async def rand_enum():
class EmptyEnum(Enum): pass
global DynamicEnum
new_enum = EmptyEnum(
'DynamicEnum',
{
**{f'{k}-{randint(0, 10)}': f'value-{randint(0, 100)}' for k in range(5)}
}
)
DynamicEnum._member_map_ = new_enum._member_map_
DynamicEnum._member_names_ = new_enum._member_names_
DynamicEnum._value2member_map_ = new_enum._value2member_map_
# It doesn't work because fastapi always holds a reference to the original enum
# DynamicEnum = new_enum
return {"message": DynamicEnum._member_map_}
if __name__ == "__main__":
import uvicorn
uvicorn.run("test-enum:app", host='0.0.0.0', debug=True, reload=True, workers=1)
view raw dynamic-enum.py hosted with ❤ by GitHub
1
2
3
4
5
6
7
8
9
10
11
myuan@jxtkfuwuqi ~> curl 10.242.155.222:8000
{"detail":[{"loc":["query","e"],"msg":"field required","type":"value_error.missing"}]}⏎
myuan@jxtkfuwuqi ~> curl 10.242.155.222:8000/rand-enum
{"message":{"0-7":"value-85","1-8":"value-6","2-5":"value-10","3-5":"value-99","4-4":"value-14"}}⏎
myuan@jxtkfuwuqi ~> curl '10.242.155.222:8000?e=value-10'
{"e":"value-10"}⏎
myuan@jxtkfuwuqi ~> curl '10.242.155.222:8000?e=value-9'
{"detail":[{"loc":["query","e"],"msg":"value is not a valid enumeration member; permitted: 'value-85', 'value-6', 'value-10', 'value-99', 'value-14'","type":"type_error.enum","ctx":{"enum_values":["value-85","value-6","value-10","value-99","value-14"]}}]}⏎
myuan@jxtkfuwuqi ~> curl '10.242.155.222:8000?e=value-11'
{"detail":[{"loc":["query","e"],"msg":"value is not a valid enumeration member; permitted: 'value-85', 'value-6', 'value-10', 'value-99', 'value-14'","type":"type_error.enum","ctx":{"enum_values":["value-85","value-6","value-10","value-99","value-14"]}}]}⏎

Enumeration constraints are still in effect while the enumeration is modified

作者

myuan

发布于

2022-07-23

更新于

2024-06-04

许可协议

评论

Just send me an email provefars@gmail.com