v0.1 fastapi: route + model + orm

This commit is contained in:
geeker
2026-09-19 10:41:18 +08:00
commit f4fa2f9714
55 changed files with 3615 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
b
+1
View File
@@ -0,0 +1 @@
a
View File
+1
View File
@@ -0,0 +1 @@
/home/geeker/architecture/home/geeker/code_repo/infrastructure_system_softwares/language_dev/python/fastapi_pycharm_proj/router/workhome/a
+1
View File
@@ -0,0 +1 @@
/home/geeker/architecture/home/geeker/code_repo/infrastructure_system_softwares/language_dev/python/fastapi_pycharm_proj/router/workhome/b
+135
View File
@@ -0,0 +1,135 @@
from fastapi import APIRouter,Query,Request,Path,Query,Body,Form,File,UploadFile
from pydantic import constr,Field,field_validator,BaseModel, EmailStr, HttpUrl, IPvAnyAddress, conint
from typing import Annotated,Literal
from datetime import date, timedelta
import datetime
from decimal import Decimal
from time import time
from uuid import UUID
import json,os,logging
route = APIRouter(prefix="/wk0915",tags=["wk0915"])
class Login(BaseModel):
username: str = Field(min_length=3, max_length=20,pattern="^[a-zA-Z]")
passwd: str = Field(min_length=6, max_length=20)
is_ok: bool
@route.post("/login/{session_id}")
def login(session_id:str = Path(min_length=10, pattern="^[a-zA-Z0-9]+$"),
usertype:int| None = None,
login:Login =Form()):
d = {
"username":login.username,
"usertype":usertype,
"is_ok":login.is_ok
}
# lg = Login.model_validate(json.loads())
# return {
# "login": d
# }
return d
@route.get("/user/{user_id}")
def user(user_id: int = Path(gt=1)):
return user_id
class Product(BaseModel):
pname: str = Field(min_length=2,max_length=50)
price: int = Field(gt=0)
stock: int = Field(gt=0)
type: str = Field(min_length=1) # todo not blank?
@route.post("/product")
def product(product:Product):
return product
stu = teac = []
class Student(BaseModel):
sid: int | None = None
sname: str
age: int | None = Field(default=None, ge=0)
sex: Literal['男','女']
hobby: set[str]
create_date: datetime.datetime = Field(default_factory=datetime.datetime.now)
@route.post("/student")
def student(student: Student):
stu.append(student)
return student
@route.get('/student')
def student(sname:str|None = Query(default=None),
sex:str|None = Query(default=None), # todo Literal validate
age:int|None = Query(default=None, ge=0, le=120)
):
# res = [s for s in stu if s['sname'] == sname]
if sname == None and sex == None and age == None : return stu
if sname != None and sex != None and age != None: return [s for s in stu if (sname != None and s.sname == sname)
and (sex != None and s.sex == sex)
and (age != None and s.age == age)]
if sname != None and sex != None : return [s for s in stu if (sname != None and s.sname == sname)
and (sex != None and s.sex == sex)]
if sname != None and age != None : return [s for s in stu if (sname != None and s.sname == sname)
and (age != None and s.age == age)]
if sex != None and age != None : return [s for s in stu if (sex != None and s.sex == sex)
and (age != None and s.age == age)]
if sex != None : return [s for s in stu if s.sex == sex]
if sname != None : return [s for s in stu if s.sname == sname]
if age != None : return [s for s in stu if s.age == age]
class Teacher(BaseModel):
name: str|None
salary: float
hiredate: date
stu: list[Student]
@route.post("/teacher")
def teacher(teacher:Teacher):
teac.append(teacher)
return teac
import random
@route.post("/upload")
def upload(files:list[bytes]= File()):
# names = random.choices(['001','002','geeker'],len(files)) # todo duplacate names
# names = random.choices(range(len(files)),len(files)) # set fix!
i = 0 # order name
saved = []
for file in files:
try:
# filepath = os.path.join(os.getcwd(), i)
filepath = os.getcwd() + "/router/workhome/" + str(i)
with open(filepath,'wb') as f:
f.write(file)
i += 1
saved.append(filepath)
except Exception: # exception too large!
pass
return saved
@route.post("/upload_file")
async def upload(files:list[UploadFile] = File()):
saved = []
for file in files:
path = os.getcwd() + "/router/workhome/" + file.filename
data = await file.read()
try:
with open(path,'w',encoding='utf-8') as f:
f.write(data)
saved.append(path)
except Exception:
pass
return saved
+86
View File
@@ -0,0 +1,86 @@
from fastapi import APIRouter,Query,Request,Path,Query,Body,Form,File,UploadFile,HTTPException
from pydantic import constr,Field,field_validator,BaseModel, EmailStr, HttpUrl, IPvAnyAddress, conint
from typing import Annotated,Literal
from datetime import date, timedelta
import datetime
from decimal import Decimal
from time import time
from uuid import UUID
import json,os,logging
from hashlib import md5 # ①导入md5加密
from libplus.logpluslplus import Log
route = APIRouter(prefix="/wk0916",tags=["wk0916"])
users = []
@route.post("/registe")
def registe(username:str, passwd:str):
users.append({"username":username,"passwd":passwd})
return users
@route.post("upload")
async def upload(file:UploadFile,res:Request):
data = await file.read()
if "洗脚" in data:
md = md5()
md.update(("sensitive_word" + str(range(10))).encode())
file_name = md.hexdigest()
with open(file_name,'w',encoding='utf-8') as f:
f.write(data)
log = Log('local_log','warning')
log.set_file_logger("logfile.log")
log.warning("洗脚"+res.client.host)
else:
log = Log('local_log', 'info')
log.get_file_logger("logfile.log")
log.warning("no洗脚" + res.client.host)
return "该文件没有敏感词汇"
stu = [{"sname":"gk","classid":"java"},
{"sname":"yb","classid":"python"}]
@route.get("/student")
def student(name:str):
for s in stu:
if s["sname"] == name:
return s
raise HTTPException(status_code=404,detail="学生不存在")
# app.mount(path="/staticfile",app=StaticFiles(directory="d://tmp"),name="sn")
class Response(BaseModel):
code: int = 200
detail: str = "添加成功"
total: int = 1
sname: str
classid: int
class Request(BaseModel):
sname: str
classid: int
@route.get("/student_model",response_model=Response)
def student_model(s:Request):
for s0 in stu:
if s0["sname"] == s.sname:
raise HTTPException(status_code=404,detail="学生不存在")
return s
@route.post("/student_model_post",response_model=Response)
def student_model_post(s:Request):
stu.append({"sname":s.sname,"classid":s.classid})
# suc / fail
flag = True
if flag : return Response(code = '200',sname=s.sname,classid = s.classid)
else :return Response(code = '500',sname=s.sname,classid = s.classid)
+50
View File
@@ -0,0 +1,50 @@
from fastapi import APIRouter,Query,Request,Path,Query,Body,Form,File,UploadFile,HTTPException,Response
from pydantic import constr,Field,field_validator,BaseModel, EmailStr, HttpUrl, IPvAnyAddress, conint,model_validator
from typing import Annotated,Literal
from datetime import date, timedelta
import datetime
from decimal import Decimal
from time import time
from uuid import UUID
import json,os,logging
from hashlib import md5 # ①导入md5加密
from libplus.logpluslplus import Log
route = APIRouter(prefix="/wk0917",tags=["wk0917"])
products = [{"name":"a","price":123.9,"stock":2},{"name":"a","price":123.9,"stock":2},{"name":"a","price":123.9,"stock":2},]
class Product(BaseModel):
name:str
price:float
stock: int
@model_validator(mode='after') #
def check(self):
pnames = [p['name'] for p in products]
if self.name in pnames: raise HTTPException(status_code="409",detail="name duplicate")
return self
@route.get("/product")
def product(name:str):
for p in products:
if name == p["name"]: return p
else: return Response(status_code="409",content="not find!")
@route.post("/product")
def product(p: Product):
products.append(p.model_dump())
return p
orders = []
@route.get("/order")
def order(name:str):
return name
@route.post("/order")
def order(name:str):
orders.append(name)
return name