1
1
import os
2
- from typing import List , Optional , Union
2
+ from typing import Generator , List , Optional , Union
3
3
4
4
import uvicorn
5
5
from fastapi import Depends , FastAPI
26
26
StreamingResponse ,
27
27
)
28
28
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 )
31
30
32
31
os .makedirs ("/tmp/storage" , 0o777 , exist_ok = True )
33
32
driver = get_driver (Provider .LOCAL )("/tmp/storage" )
@@ -80,7 +79,7 @@ class CategoryOut(CategoryBase):
80
79
81
80
82
81
def category_form (
83
- name : str = Form (...),
82
+ name : str = Form (..., min_length = 3 ),
84
83
image : Optional [UploadFile ] = FormFile (None ),
85
84
):
86
85
return Category (name = name , image = image )
@@ -89,37 +88,45 @@ def category_form(
89
88
app = FastAPI (title = "SQLAlchemy-file Example" , debug = True )
90
89
91
90
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
+
92
102
@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 ()
96
105
97
106
98
107
@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 )
105
113
106
114
107
115
@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 )
119
126
120
127
121
128
@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 (...)):
123
130
try :
124
131
file = StorageManager .get_file (f"{ storage } /{ file_id } " )
125
132
if isinstance (file .object .driver , LocalStorageDriver ):
0 commit comments