增加日志文件

This commit is contained in:
pzz
2026-09-19 15:07:02 +08:00
parent fecf45d592
commit 4609cf19c0
+285
View File
@@ -0,0 +1,285 @@
# '''stu = [
# {'sid':3,'name':'庞崽子','age':18,'sex':'女','address':'广东省深圳市龙岗区'},
# {'sid':1,'sex':'女','name':'pzz','age':20,'address':'广东省广州市'},
# {'sid':2,'name':'啊崽','sex':'男','age':30,'address':'广东省深圳市龙岗区'}
# ]
#
# # 定义用户存储列表
# user_passwd = []
#
# from fastapi import FastAPI,Query,Path,Body,Form,File,UploadFile
# from pydantic import BaseModel,Field,HttpUrl
# from typing import Optional,Union,Literal
# from datetime import date,datetime
# from uuid import UUID
#
# ap=FastAPI()
#
# @ap.get('/',summary='测试接口',tags=['测试用'])
# def test():
# return '测试成功...'
#
# @ap.get('/students/{sid}',tags=['学生'],summary='学生信息查询接口',description='接口更加详细的解释说明...')
# def get_students(sid:int = Path(ge=1,description='查询的id') ):
# return [i for i in stu if i['sid'] == sid]
#
# # 定义请求体模型
# class Stu(BaseModel):
# sid:int|None|str = 1
# name:str|None = Field(default='sz',min_length=2,max_length=50)
# age:int = Field(default=0,ge=0,le=150,description='年龄属性')
# sex:Literal['男','女'] # 限制sex属性只能是男、女
# address:str|None = None
# birthday:date
# url:HttpUrl
# date_creat_date:datetime
#
# @ap.post('/students',tags=['学生'],summary='学生信息新增接口')
# def add_students(s:Stu):
# print( s )
# print(type(s))
# print('拿到类属性:',s.sid,s.name,s.address)
# print('将请求体模型的所有类属性解析成字典:',s.model_dump())
# stu.append( s.model_dump() )
# return s
#
# class StuUpdate(BaseModel):
# name:str|None = None
# age:int = None
# sex:Literal['男','女']|None = None
# address:str|None = None
#
# @ap.put('/students/{sid}',tags=['学生'],summary='学生信息更新接口')
# def update_students(sid:int,s:StuUpdate):
# d = s.model_dump(exclude_unset=True)
# print( d ) # exclude_unset=True 只解析前端输入的键值对,默认值不会解析
# for i in stu:
# if i['sid'] == sid:
# for k,v in d.items():
# i[k] = v
# return {'code':200,'detail':'OK'}
#
# @ap.delete('/students/{sid}',tags=['学生'],summary='学生信息删除接口')
# def delete_students(sid:int):
# for i in stu:
# if i['sid'] == sid:
# stu.remove(i)
# return {'code':200,'detail':'OK'}
#
# # 修改第二个新增接口,路径改成 /students/add 避免路由冲突
# @ap.post('/students/add',tags=['新增学生请求体'],summary='添加')
# async def add_students2(stu:Stu):
# print('请求体:',stu,type(stu))
# print('打印StuInfo的属性',stu.sid,stu.name,stu.age)
# print('通过属性字典来查看:', stu.__dict__)
# print('通过model_dump来解析成字典:',stu.model_dump(mode="json"))
# return stu
#
# @ap.get('/users',tags=['用户信息'])
# def get_students(user_passwd=None):
# return user_passwd
#
# class User(BaseModel):
# user:str
# passwd:str
#
# # 用户注册,改成JSON方式,移除Form()
# @ap.post('/users',tags=['用户注册'])
# def user_register(user:User):
# user_passwd.append({'user':user.user,'passwd':user.passwd})
# return {'code':200,'detail':'OK'}
# @ap.post('/files1')
# def add_file(f:bytes=File(...)):
# print('打印二进制字符节:',f)
# print('将二进制字节码成utf-8字符集:',f.decode('utf-8'))
# with open('test.txt','wb') as file:
# file.write(f)
# @ap.post('/files2')
# async def add_file(f:UploadFile):
# print('uploadfile上传文件,读取该对象:',f)
# print('文件名称:',f.filename)
# text=await f.read()
# print('读取的二进制字节内容:', text)
# print('读取的正常字符内容:', text.decode('utf-8'))
# with open(f.filename,'wb') as file:
# file.write(text)
#
# if __name__ == '__main__':
# import uvicorn
# uvicorn.run("log:ap",host='127.0.0.1',port=12345)
# '''
# 【day20作业】
# 把课上的笔记内容理清,再做下面的作业!
from email.policy import default
from idlelib.query import Query
import datetime
# import File
# 1.阐述下你对restful规范的理解
'''①restful规范不是技术约束,而是一种开发习惯规范而已
②restful面向资源开发,所以接口的路径名字要以资源的名字书写,见名知意,资源是复数时,要加上s代表单词是复数
③restful规范不同方法的接口,定位不一样;'''
# 2.什么是路径参数?查询参数?
'''①路径参数:写在路径里面可变的变量参数!可以动态输入接收,用/students/{id}
②查询参数:用来查询获取资源的参数,在url里面是这么体现的:http://地址/路径?查询参数query'''
# 3.get接口跟post接口有什么区别?
'''①get接口是用来获取资源,接口可以直接在浏览器地址栏里访问,没有请求体
②post接口是用来新增资源的,接口不能直接在浏览器地址栏访问,有请求体,请求体携带的数据不能直接看到'''
# 4.Path() Query() Field() 三者的区别和用途
'''Path() 用来做路径参数的校验约束!
Query() 用来做查询参数的校验约束!
Field() 用来做请求体模型属性的校验约束!'''
# 5.根据要求完成如下接口
# ①POST 接口 /login/{session_id},路径参数session_id要校验必须是字母跟数字组合,且长度要大于10字符
# ②请求体是个Form表单类型,属性包含:username(字符串 3-20 位,字母开头)、passwd(字符串 6-20 位)、is_ok(布尔)
# ③功能函数还要有查询参数usertype,类型是 int
# ④返回登录 username属性、usertype参数值、跟is_ok的json格式
'''from ai import FastAPI,Form,Path,Query
ap=FastAPI()
@ap.post('/login/{session_id}')
async def login_session(
session_id: str = Path(min_length=11, pattern='^[a-zA-Z0-9]+$'),
username: str = Form(..., min_length=3, max_length=10, pattern='^[a-zA-Z].*'),
password: str = Form(..., min_length=6, max_length=20),
is_ok: bool = Form(),
usertype: int = Query()
):
print('返回的打印有:',session_id,username,is_ok,usertype)
return {'username':username,'is_ok':is_ok,'usertype':usertype}
if __name__ == '__main__':
import uvicorn
uvicorn.run("log:ap",host='127.0.0.1',port=12345)'''
# 6.根据要求完成如下接口
# ①GET 接口 /users/{user_id}
# ②user_id 必须 ≥ 1
# ③返回用户信息
'''@ap.get( '/users/{user_id}' )
async def get_users(user_id:int = Path(...,ge=1)):
return {"user_id":user_id}'''
# 7.创建商品的接口POST请求
# 需求:
# ①商品名属性:2-50 字符,
# ②价格属性:≥ 0
# ③库存属性:≥ 0
# ④分类属性:非空
# ⑤返回值是该商品的全部信息
'''from fastapi import FastAPI,Form,Path
from pydantic import BaseModel
from datetime import datetime,date
ap=FastAPI()
class Product(BaseModel):
product_id:int=Path(min_length=2,max_length=50),
product_price:float=Form(...,ge=0),
product_num:str=Form(...,ge=0),
product_type:str
@ap.post( '/products' )
async def add_products(p:Product):
return p
if __name__ == '__main__':
import uvicorn
uvicorn.run("log:ap",host='127.0.0.1',port=12345)'''
# 8.定义一个学生列表的全局变量 stu=[] 来存放学生信息,teac = [] 来存老师信息,老师跟学生的信息都是字典的形式存再列表里,要求完成以下接口需求
# ①定义一个请求体student模型,用来创建新增学生的信息到stu里,包含属性sid(int,默认值none)、sname(str)、age(默认值none,大于等于0)、sex(性别,只能是'男''女')
# 、hobby(set类型,元素是str,多个爱好)、create_data(数据创建时间,datetime类),编写post请求的接口,传入数据,返回学生属性json
'''from FastApi import FastAPI, Query
from pydantic import BaseModel, Field
from typing import Literal
from datetime import datetime, date
from enum import Enum
Stu = [
{'sid': 3, 'sname': '庞崽子', 'age': 18, 'sex': '女', 'address': '广东省深圳市龙岗区'},
{'sid': 1, 'sname': 'pzz', 'age': 20, 'sex': '女', 'address': '广东省广州市'},
{'sid': 2, 'sname': '啊崽', 'age': 30, 'sex': '男', 'address': '广东省深圳市龙岗区'},
]
stu = [] # 新增学生存这里
teac = [] # 老师存这里
ap = FastAPI()
from enum import Enum
class SexEnum(str, Enum):
f = '女'
m = '男'
class Student(BaseModel):
sid: int | None = None
sname: str = Field(..., min_length=1, max_length=20)
age: int | None = Field(None, ge=0)
sex: SexEnum | None = None
hobby: set[str]
create_date: date
# ②基于stu学生列表查询,编写一个get请求,可以通过名字、性别(只能男或女)、
# 年龄(要有范围,0-120)来查询stu里的学生信息,返回值是查询命中的学生信息。如果没有任何的参数,那么就返回所有的学生信息
@ap.get('/',summary='测试接口',tags=['测试用'])
def test():
return '测试成功...'
@ap.post('/students')
def add_students(s:Student):
print(s.model_dump())
stu.append(s.model_dump())
@ap.get("/students")
async def get_students(
sname: str | None = None,
sex: SexEnum | None = None,
age: int |None= Query(default=None,ge=0,le=None),
):
stu_tmp = []
for i in Stu:
if sname and sname not in i["sname"]:
continue
if sex and i["sex"] != sex.value:
continue
if age is not None and i["age"] :
continue
stu_tmp.append(i)
return stu_tmp
# ③定义一个请求体teacher模型,用来创建添加老师信息的到teac列表里,
# 有属性name(str或none)、salary(float)、hiredate(date 入职时间)、
# stu(使用如上的student类模型,嵌套,表示所带的学生),返回值是teac列表的所有信息
class teacher(BaseModel):
sname:str|None=None
salary:float
hiredate:date
stu:Student
@ap.post('/teachers', summary='新增老师')
async def add_teachers(t: teacher):
teac.append(t.model_dump())
return teac
if __name__ == '__main__':
import uvicorn
uvicorn.run("log:ap",host='127.0.0.1',port=12345)'''
# 9.编写两个文件上传的接口
# ①利用bytes字节流类型上传文件,实现多文件上传,并将文件的内容保存到当前目录,保存的文件名字自定义
# ②利用uploadfile类型上传文件,实现多文件上传,并将文件保存到当前目录,文件名字原来叫什么名字,保存就叫什么名字
# ③总结下bytes跟uploadfile两种文件上传的区别
'''from fastapi import FastAPI, Query, UploadFile, File
ap = FastAPI()
@ap.post("/files/bytes")
async def add_bytes_files(f:list[bytes]=File()):
for i in range( len(f) ):
print('解码 :',f[i].decode('utf-8') )
with open( f'第{i+1}个文件.txt','wb' ) as e:
e.write(f[i])
return e
@ap.post("/files/uploadfile")
async def add_uploadfile(f:list[UploadFile]):
print(f)
for i in f:
print('文件名字:',i.filename)
text = await i.read()
print( '文件的内容:',text.decode('utf-8') )
with open(i.filename,'wb') as ff:
ff.write(text)
return f
if __name__ == '__main__':
import uvicorn
uvicorn.run("log:ap",host='127.0.0.1',port=12345)'''
# 10.请总结下fastapi接口编写时,使用pydantic请求体模型的流程
'''①导入pydantic里的BaseModel基类
②编写自定义的请求体模型,继承BaseModel基类
③定义模型的类属性,使用Field()来约束校验属性的数据
④引用时直接 形参:请求体模型'''