11import os
2- from typing import List , Optional , Union
2+ from typing import Generator , List , Optional , Union
33
44import uvicorn
55from fastapi import Depends , FastAPI
2626 StreamingResponse ,
2727)
2828
29- engine = create_engine ("sqlite:////tmp/example.db?check_same_thread=False" , echo = True )
30-
29+ engine = create_engine ("sqlite:///example.db?check_same_thread=False" , echo = True )
3130
3231os .makedirs ("/tmp/storage" , 0o777 , exist_ok = True )
3332driver = get_driver (Provider .LOCAL )("/tmp/storage" )
@@ -80,7 +79,7 @@ class CategoryOut(CategoryBase):
8079
8180
8281def category_form (
83- name : str = Form (...),
82+ name : str = Form (..., min_length = 3 ),
8483 image : Optional [UploadFile ] = FormFile (None ),
8584):
8685 return Category (name = name , image = image )
@@ -89,37 +88,45 @@ def category_form(
8988app = FastAPI (title = "SQLAlchemy-file Example" , debug = True )
9089
9190
91+ def get_session () -> Generator [Session , None , None ]:
92+ session : Session = Session (engine , expire_on_commit = False )
93+ try :
94+ yield session
95+ except Exception as e :
96+ session .rollback ()
97+ raise e
98+ finally :
99+ session .close ()
100+
101+
92102@app .get ("/categories" , response_model = List [CategoryOut ])
93- def get_all ():
94- with Session (engine ) as session :
95- return session .execute (select (Category )).all ()
103+ async def get_all (session : Session = Depends (get_session )):
104+ return session .execute (select (Category )).scalars ().all ()
96105
97106
98107@app .get ("/categories/{id}" , response_model = CategoryOut )
99- def get_one (id : int = Path (...)):
100- with Session (engine ) as session :
101- category = session .get (Category , id )
102- if category is not None :
103- return category
104- return JSONResponse ({"detail" : "Not found" }, status_code = 404 )
108+ async def get_one (id : int = Path (...), session : Session = Depends (get_session )):
109+ category = session .get (Category , id )
110+ if category is not None :
111+ return category
112+ return JSONResponse ({"detail" : "Not found" }, status_code = 404 )
105113
106114
107115@app .post ("/categories" , response_model = CategoryOut )
108- def create_new (category : Category = Depends (category_form )):
109- with Session (engine ) as session :
110- try :
111- session .add (category )
112- session .commit ()
113- session .refresh (category )
114- return category
115- except ValidationError as e :
116- return JSONResponse (
117- dict (error = {"key" : e .key , "msg" : e .msg }), status_code = 422
118- )
116+ async def create_new (
117+ category : Category = Depends (category_form ), session : Session = Depends (get_session )
118+ ):
119+ try :
120+ session .add (category )
121+ session .commit ()
122+ session .refresh (category )
123+ return category
124+ except ValidationError as e :
125+ return JSONResponse (dict (error = {"key" : e .key , "msg" : e .msg }), status_code = 422 )
119126
120127
121128@app .get ("/medias/{storage}/{file_id}" , response_class = FileResponse )
122- def serve_files (storage : str = Path (...), file_id : str = Path (...)):
129+ async def serve_files (storage : str = Path (...), file_id : str = Path (...)):
123130 try :
124131 file = StorageManager .get_file (f"{ storage } /{ file_id } " )
125132 if isinstance (file .object .driver , LocalStorageDriver ):
0 commit comments