当前位置:   article > 正文

FastAPI ------框架基础_fastapi框架

fastapi框架

一、初知FastAPI

1.1 FastAPI简介

FastAPI是一种现代,快速(高性能)的Web框架,用于基于标准 Python类型提示使用Python 3.6+构建API。

基于以下第三方包开发(部分):

  • Starlette基于ASGI异步网关协议接口的框架 。
  • Pydantic数据验证和设置管理库。
  • Uvicorn基于 asyncio(异步io) 开发的一个轻量级高效的 web 服务器框架。
  • Requests HTTP库。
  • Aiofiles 如果要使用FileResponse(文件相应)静态文件。
  • Jinja2 网页模板渲染引擎。
  • Python-multipart 表单解析。

1.2 安装FastAPI

1.2.1 虚拟环境安装

安装
在这里插入图片描述
.venv1是虚拟环境名,不一定是这个可以自己起名。
安装教程

激活:

venv1\Scripts\activate
  • 1

在这里插入图片描述

1.2.2 pip安装FastAPI

在虚拟环境中使用以下命令即可

pip install fastapi
  • 1

在这里插入图片描述

由于启动需要依赖于Uvicorn,还需要安装,命令如下

uvicorn
官方解释:自行搜索。
通俗解释:就是一个ASGI服务器,就是把你代码跑在一个你认识的一个平台上。
ASGI服务器
解释:异步网关协议接口。它是介于网络协议服务和Python应用之间的标准接口。
通俗解释:就是能够处理多种通用的协议类型,例如:HTTP、HTTP2、WebSocket等

 pip install uvicorn
  • 1

在这里插入图片描述

1.3 可能出现的问题

Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

这种情况就是端口占用

中文乱码

在这里插入图片描述
这种情况博主还没解决,不过在PyCharm中运行就不会出现。

二、 第一个FastAPI

2.1 方法一

在虚拟环境中运行

  1. 我们在虚拟环境中建立一个main.py文件
    文件内容如下
from fastapi import  FastAPI
app = FastAPI()

@app.get("/")

def read_root():
    return {"Hello","World"}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第一行:导入了FastAPI
第二行:创建了该类的一个实例
第四行:使用app()装饰器告诉FastAPI什么样的URL能触发被装饰的函数。

需要注意的是:

  1. 你可以将get操作方法更改成@app.post()、@app.put()、@app.delete()等方法
  2. 你可以更改相应的路径("/")为自己想要的,例如我更改为("/hello_word/")
  3. 函数的返回值可以是
    dict,list,单独的值,比如str,int,或者是Pydantic模型

  1. 在虚拟环境下运行
uvicorn main:app --reload
  • 1

在这里插入图片描述
参数说明:
main:main.py文件
app :在main.py内部创建的对象,通过app = FastAPI()创建
--reload :使服务器在代码更改后重新启动,仅在开发的时候使用就好了。

2.2 方法二

也可以不在虚拟环境下运行,这就需要在本机上安装上面说的两个库。

步骤和上面是类似的。

2.3 方法三

我们可不可以不用命令行运行呢,是可以的,看下面代码:

from fastapi import  FastAPI
import uvicorn
app = FastAPI()

@app.get("/")

def read_root():
    return {"Hello","World"}

if __name__ == '__main__':
    uvicorn.run(app=app,host="127.0.0.1",port=8000)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

添加了

import uvicorn

  • 1
  • 2
if __name__ == '__main__':
    uvicorn.run(app=app,host="127.0.0.1",port=8000)

  • 1
  • 2
  • 3

.host="127.0.0.1",port=8000,表示指定本地电脑为服务器,端口号为8001

PyCharm直接运行即可

在这里插入图片描述

2.4运行效果

在这里插入图片描述

三、API 文档

.FastAPI提供了两种文档形式:交互式API 文档 和备份API 文档

3.1 交互式API 文档

在新建的main.py文件中写入,如下代码:

from fastapi import  FastAPI
import uvicorn
app = FastAPI()

@app.get("/")

async def read_root():
    return {"Hello","World"}
@app.get("/items/{item_id}")

def read_item(item_id:int,q:str =None):
    return {"item_id":item_id,"q":q}

if __name__ == '__main__':
    uvicorn.run(app=app,host="127.0.0.1",port=8000)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

我们重点看第二个函数,其中{item_id}是路径参数,q:str =None是查询参数,详细的会在后边解释。
我们运行后,在浏览器中输入http://127.0.0.1:8000/docs
在这里插入图片描述

图中的== GET ==就是 @app.get("/") 指定的请求方式,我们点击第二个

在这里插入图片描述
填入信息后 单击 Execute按钮。
程序就会响应。

3.2 备用API 文档

交互式是在后边添加docs
备份则是 redoc

四、 Path 路径参数

4.1 声明路径参数

@app.get("/items/{item_id}")

def read_item(item_id:int):
    return {"item_id":item_id}
  • 1
  • 2
  • 3
  • 4
  • 其中{item_id}就是路径参数,其值会作为参数item_id传递到read_item视图函数中。

4.2 路径参数的类型

路径参数有多种类型,如int 、str、float
如上面的 item_id:int就是将路径参数指定为int类型

  • 注意:如果指定类型之后,会自动进行类型效验,如果不符合会显示一个HTTP错误页。

我输入http://127.0.0.1:8000/items/sd
在这里插入图片描述
因为sd 是字符串型,而不是int型

4.3 指定路径顺序

有了上面的路径参数,或许你会问了,

@app.get("/items/me")

@app.get("/items/{item_id}")

  • 1
  • 2
  • 3
  • 4

当我输入http://127.0.0.1:8000/items/me会调用那个?

  • 路径是以顺序进行判断的,简单来说就是上边的那个放在上面就会调用那个。

五、 Query 查询参数

当声明不属于路径参数的其他函数参数时, FastAPI会将其自动解释为Query参数,也就是查询参数。Query参数就是**URL地址中“?”之后的一系列 value键值对,每组键值对用“&”分割开来。**这也是我们在网址中经常看到的。

在这里插入图片描述

5.1 声明 Query 参数

Query 参数 是在视图函数中声明的:如

@app.get("/items/{item_id}")

def read_item(item_id:int,q:str =None):
    return {"item_id":item_id,"q":q}
  • 1
  • 2
  • 3
  • 4
  • q:str =None 中 q 就是Query 参数。

5.2 设置Query 参数

Query 参数不是path 中固定的部分,它们是可选的,并且有默认值。

在上面的例子中,Query 参数 拥有默认值 q= None

如果访问http://127.0.0.1:8000/items/1
得到
在这里插入图片描述

  • 注意当参数没有默认值的时候,那么这个参数就必须传入。

六、Request Body 请求体

注意事项

  1. 定义请求体,需要使用 Pydantic 模型
  2. 不能通过GET请求发送请求体
  3. 发送请求体数据,必须使用以下几种方法之一:POST(最常见)、PUT、DELETE、PATCH

创建数据模型

实现请求体总共包含三个步骤。
(1)定义模型。从pydantic中导入BaseModel

from pydantic import BaseModel


  • 1
  • 2
  • 3

(2)创建模型。声明模型需要一个类,且该类继承BaseModel

from pydantic import BaseModel

class Item(BaseModel):
    name: str 
    description: str = None
    price: float 
    tax: float = None 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Query参数一样:数据类型的属性如果不是必须的话,可以拥有一个默认值或者是可选None。否则,该属性就是必须的。

七、Header 请求头参数

  1. 首先导入 Header
from fastapi import FastAPI,Header
  • 1
  1. 声明Header参数。第一个值是默认值,可以传递所以验证或注释参数。
from fastapi import FastAPI,Header
 app = FastAPI()
 &app.get("/items/")
 async def read_items(*,userget : str = Header(None)):
 	return {"userget":userget}
  • 1
  • 2
  • 3
  • 4
  • 5

八、Form 表单数据

  1. 使用Form类需要先安装python-multipart,安装命令如下
pip install python-multipart
  • 1
  1. FastAPI中导入 Form
from fastapi import FastAPI,Form
  • 1
  1. 创建Form 参数。
from fastapi import FastAPI,Form
app = FastAPI()

@app.post("/login/")

async def login(*,
		userneme : str = Form(...),
		password : str = Form(...)
	):
	return {"userneme":userneme}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意:async 是异步async/await功能。

九、操作MySQL

因为用到 ORM框架SQLAlchemy。所以可以看下面这篇文章了解一下。
ORM

数据表模型

使用SQLAlchemy进行数据库操作,其具体设置如下:

数据库配置文件:

class Config:
    SECRET_KEY = 'mrsoft' #密钥
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # 数据库链接地址
    SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:andy123456@localhost/idiom?charset=utf8mb4"
  • 1
  • 2
  • 3
  • 4
  • 5

数据库连接格式

dialect+driver://username:password@host:port/database

  • 1
  • 2
  • dialect:数据库类型,比如mysql,sqlite,注意:一定要是小写
  • driver:是python对应的驱动,如果不指定,则会使用默认的驱动,比如MySQL默认驱动是MySQLdb
  • username:数据库用户名
  • password:数据库密码
  • host:数据库的域名
  • port:数据库监听的端口,通常默认是3306
  • database:连接的数据库的名字
  • 连接地址后面还可以加上查询字符串来设定,如charset=utf8

连接数据库文件

from sqlalchemy import create_engine
from  sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import  sessionmaker

from  fastapi_idiom.config import  Config
#创建引擎
engine = create_engine(Config.SQLALCHEMY_DATABASE_URL)
#创建数据库会话
SessionLocal = sessionmaker(autocommit= False,autoflush =False,bind = engine)
#声明基类,创建了一个ORM基类
Base = declarative_base()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

创建模型文件

from sqlalchemy import  Column,Integer,String,DateTime
from  fastapi_idiom.models.database import  Base
from  datetime import  datetime

#会员数据模型
#定义 User 类
class User(Base):
    __tanlename__ = "user"   #定义表名
    # 定义属性
    #在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须#是sqlalchemy给我们提供好的数据类型
    id = Column(Integer,primary_key=True,index=True)
    openid = Column(String(80))
    nickname = Column(String(100))
    avatar = Column(String(255))
    level = Column(Integer)
    addtime = Column(DateTime,index=True,default=datetime.now)

    def __repr__(self):
        #Python中这个_repr_函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串:
        return '<User %r>'%self.nickname
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

模型对象方法

为了实现代码重用,需要将模型对象用到的方法写入 一个文件中。

from datetime import datetime

import sqlalchemy
from fastapi_idiom.models.database import SessionLocal

from .models import  User,Game

db = SessionLocal() #创建会话

# 获取用户信息
def get_user(openid : str):
    return db.query(User).filter(User.openid == openid).first()


#创建用户
def create_user(openid ,nickname,avatar):
    db_user = User(
        openid = openid,
        nickname = nickname,
        avatar = avatar,
        level = 0,
        addtime = datetime.now()
    )

    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

详细的SQLAlchemy使用可以参考这篇文章:
SQLAlchemy

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/416425
推荐阅读
相关标签
  

闽ICP备14008679号