为了账号安全,请及时绑定邮箱和手机立即绑定

高性能 FastAPI 框架入门精讲

  • 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

    查看全部
    1. pydantic模块中引入BaseModel构建基本数据模型,ValidationError来捕获在对模型校验时发生的异常

    2. 从typing模块中引入List、Optional等类,方便进行类型标注

    3. 继承了BaseModel的自定义数据模型类,可以使用如下方法来达到数据的转换:

      1. 实例.dict() --> 返回python的字典类型

      2. 实例.json() --> 返回json字符串

      3. 实例.copy() --> 浅拷贝数据

      4. 类.parse_obj(obj=...) --> 将python的字典类型转换为数据模型

      5. 类.parse_raw(str) --> 将json字符串转换为数据模型

      6. 类.parse_file(path) --> 将文件内的json数据转换为数据模型

      7. 实例.schema() --> 返回schema形式的数据格式

      8. 实例.schema_json() --> 以json字符串来返回schema形式的数据

      9. 类.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())
    查看全部
  • 不同包之间的版本兼容性

    查看全部
首页上一页1234下一页尾页

举报

0/150
提交
取消
课程须知
任何想学习Python开发的同学,尤其是需要高效率完成高并发、高性能项目的同学都可以学习
老师告诉你能学到什么?
FastAPI 框架特性及性能优势 如何定义各种请求参数和验证 模板渲染和静态文件配置 FastAPI 的表单数据处理 全面学习 FastAPI 依赖注入系统 FastAPI 的安全、认证和授权 大型工程应该如何目录结构设计 FastAPI 的中间件开发方法和规范 跨域资源共享的原理和实现方式

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!