-
from enum import Enum from fastapi import APIRouter, Path app01 = APIRouter() """Path Parameters and Number Validations 路径参数和数字验证""" @app01.get("path/params") def path_params01(): return {"message": "This is a message"} @app01.get("path/{params}") # 函数的顺序就是路由的顺序 def path_params01(params: str): return {"message": "This is a {}".format(params)} class CityName(str, Enum): Beijing = "Beijing China" Shanghai = "Shanghai China" @app01.get("/enum/{city}") async def latest(city: CityName): # 枚举类型参数 if city == CityName.Shanghai: return {"city_name": city, "confirmed": 192, "death": 8} if city == CityName.Beijing: return {"city_name": city, "confirmed": 12, "death": 1} return {"city_name": city, "latest": "Unknown"} @app01.get("/files/{file_path: path}") # 通过path parameters传递文件路径 def filepath(file_path: str): return f"The file path if {file_path}" @app01.get("/path_/{num}") def path_params_validate( num: int = Path(None, title="You number", description="无法描述", ge=1, le=10) ): return num
查看全部 -
安装包
1,包的版本问题
存在兼容性的问题
2.通过requirements.txt 安装
pip install requirements.txt
查看全部 -
pydantic模块中引入BaseModel构建基本数据模型,ValidationError来捕获在对模型校验时发生的异常
从typing模块中引入List、Optional等类,方便进行类型标注
继承了BaseModel的自定义数据模型类,可以使用如下方法来达到数据的转换:
实例.dict() --> 返回python的字典类型
实例.json() --> 返回json字符串
实例.copy() --> 浅拷贝数据
类.parse_obj(obj=...) --> 将python的字典类型转换为数据模型
类.parse_raw(str) --> 将json字符串转换为数据模型
类.parse_file(path) --> 将文件内的json数据转换为数据模型
实例.schema() --> 返回schema形式的数据格式
实例.schema_json() --> 以json字符串来返回schema形式的数据
类.construct(obj=) --> 不执行数据类型校验的parse_obj
4. pydantic模型可以互相嵌套
5. 使用sqlalchemy中构建ORM模型,并在pydantic模型中建立联系
6. 使用pydantic模型类的from_orm()方法来构造ORM模型和pydantic模型的连接体模型。查看全部 -
from datetime import datetime
from pathlib import Path
from typing import List, Optional
from pydantic import BaseModel, ValidationError, constr
from sqlalchemy import Column, Integer, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.ext.declarative import declarative_base
print("\033[31m1. --- Pydantic的基本用法。Pycharm可以安装Pydantic插件 ---\033[0m")
class User(BaseModel):
id: int
name: str = "john snow"
signup_ts: datetime
friends: List[int] = []
external_data = {
"id": "123",
"signup_ts": "2021-08-09 11:12:30",
"friends": ["1", 2, 4]
}
# if __name__ == '__main__':
user = User(**external_data)
print(user.id, user.name)
print(user.dict())
print("\033[31m2. --- 校验失败处理 ---\033[0m")
try:
u = User(id=1, signup_ts=datetime.today(), friends=['not a number', 1])
print(u)
except ValidationError as e:
print(e.json())
print("\033[31m3. --- 模型类的属性和方法 ---\033[0m")
print(user.dict())
print(user.json())
print(user.copy())
# 类方法
print("类方法")
print(User.parse_obj(external_data))
print(User.parse_raw('{"id": 123, "name": "john snow", "signup_ts": "2021-08-09T11:12:30", "friends": [1, 2, 4]}'))
file = Path("pydanic_tutorial.json")
file.write_text('{"id": 123, "name": "john snow", "signup_ts": "2021-08-09T11:12:30", "friends": [1, 2, 4]}')
print(User.parse_file(file))
print(user.schema())
print(user.schema_json())
# 不校验属性, 直接构造
print(User.construct(id="sdf", signup_ts=datetime.today(), friends=['not a number', 1]))
print(User.__fields__.keys())
print("\033[31m4. --- 递归模型 ---\033[0m")
class Sound(BaseModel):
sound: str
class Dog(BaseModel):
name: str
weight: Optional[float] = None
sound: List[Sound]
# dog = Dog(name="hello kitty", weight=1.8, sound=[{"sound": "wangwang~"}, {"sound": "yingying ~"}])
# print(dog.dict())
dog1 = Dog(name="hello kitty", weight=1.8, sound=[Sound(sound="wangwang~"), Sound(sound="yingying~")])
print(dog1.dict())
print("\033[31m5. --- ORM模型:从类实例创建符合ORM对象的模型 ---\033[0m")
Base = declarative_base()
class CompanyOrm(Base):
__tablename__ = 'companies'
id = Column(Integer, primary_key=True, nullable=False)
public_key = Column(String(20), index=True, nullable=False, unique=True)
name = Column(String(63), unique=True)
domains = Column(ARRAY(String(255)))
class CompanyModel(BaseModel):
id: int
public_key: constr(max_length=20)
name: constr(max_length=63)
domains: List[constr(max_length=255)]
class Config:
orm_mode = True
co_orm = CompanyOrm(
id=123,
public_key='foobar',
name='Testing',
domains=['example.com', 'foobar.com'],
)
print(CompanyModel.from_orm(co_orm))查看全部 -
注意版本兼容问题
查看全部 -
import os
查看全部 -
1、导入HTTPException
2、raise HTTPException(status_code= , detail="",headers={"X-Error":"Error"})
return {"city":city}
查看全部 -
app = FastAPI(
title=' ...' , #标题
description='', #描述
version='', #版本
docs_url='/docs', #docs文档地址
redoc_url='/redoc' #redoc文档地址
查看全部 -
static挂载 app.mount('/static',app=StaticFiles(directory='./...'))
查看全部 -
uploadFile:
上传文件,优势较大,可上传大文件,要提供下载功能
查看全部 -
版本问题需要有版本规划
查看全部 -
##函数顺序就是路由顺序
查看全部 -
from fastapi import APIRouter from typing import Optional, List, Tuple, Dict from pydantic import BaseModel, EmailStr tutor04 = APIRouter() class UserBase(BaseModel): username: str email: EmailStr mobile: List[str] = [None] address: str = None full_name: Optional[str] = None class UserIn(UserBase): password: str class UserOut(UserBase): pass users = { "user01": {"username": "001", "password": "3456789", "email": '123@163.com'}, "user02": {"username": "001", "password": "3456789", "email": '123@163.com', "address": "mnnnnnnnnnnnnnn大桥"}, "user03": {"username": "001", "password": "3456789", "email": '123@163.com', "address": "mnnnnnnnnnnnnnn大桥", "full_name": "jack"}, } @tutor04.post('/04/response_model', response_model=UserOut) async def tutor04_response_model( user: UserIn ): print(users.get('user01')) return users.get('user01')
查看全部 -
# COOKIE @tutor03.get('/033/cookie') def cookie( cookie_id: Optional[str] = Cookie(None) ): return {"cookie_id": cookie_id} # HEADERS @tutor03.get('/033/headers') def headers( user_agent: Optional[str] = Header(None, convert_underscores=True), x_token: Optional[str] = Header(None, convert_underscores=True) ): return {"user_agent": user_agent, 'x_token': x_token}
查看全部 -
class Demo(BaseModel): name: str price: float is_offer: Union[bool, None] = None descrition: List[str] = []
赋初始值被认为是 Optional 字段,否则被认为是 Required 字段
也可以通过 Optional 明确指定
另外,如果指定了字段类型,那么通过以下方式确认字段时也是有顺序的
print(Demo.__fields__.keys())
查看全部
举报