FastAPI

  • 一、初知FastAPI
    • 1.1 FastAPI简介
    • 1.2 安装FastAPI
      • 1.2.1 虚拟环境安装
      • 1.2.2 pip安装FastAPI
    • 1.3 可能出现的问题
      • Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
      • 中文乱码
  • 二、 第一个FastAPI
    • 2.1 方法一
    • 2.2 方法二
    • 2.3 方法三
    • 2.4运行效果
  • 三、API 文档
    • 3.1 交互式API 文档
    • 3.2 备用API 文档
  • 四、 Path 路径参数
    • 4.1 声明路径参数
    • 4.2 路径参数的类型
    • 4.3 指定路径顺序
  • 五、 Query 查询参数
    • 5.1 声明 Query 参数
    • 5.2 设置Query 参数
  • 六、Request Body 请求体
    • 注意事项
    • 创建数据模型
  • 七、Header 请求头参数
  • 八、Form 表单数据
  • 九、操作MySQL
    • 数据表模型
      • 数据库配置文件:
      • 数据库连接格式
      • 连接数据库文件
      • 创建模型文件
    • 模型对象方法

一、初知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.2.2 pip安装FastAPI

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

pip install fastapi

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

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

 pip install uvicorn

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"}

第一行:导入了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


参数说明:
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)

添加了

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

.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)

我们重点看第二个函数,其中{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}
  • 其中{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}")

当我输入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}
  • 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

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

from pydantic import BaseModelclass Item(BaseModel):name: str description: str = Noneprice: float tax: float = None 

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

七、Header 请求头参数

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

八、Form 表单数据

  1. 使用Form类需要先安装python-multipart,安装命令如下
pip install python-multipart
  1. FastAPI中导入 Form
from fastapi import FastAPI,Form
  1. 创建Form 参数。
from fastapi import FastAPI,Form
app = FastAPI()@app.post("/login/")async def login(*,userneme : str = Form(...),password : str = Form(...)):return {"userneme":userneme}

注意: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"

数据库连接格式

dialect+driver://username:password@host:port/database
  • 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  sessionmakerfrom  fastapi_idiom.config import  Config
#创建引擎
engine = create_engine(Config.SQLALCHEMY_DATABASE_URL)
#创建数据库会话
SessionLocal = sessionmaker(autocommit= False,autoflush =False,bind = engine)
#声明基类,创建了一个ORM基类
Base = declarative_base()

创建模型文件

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

模型对象方法

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

from datetime import datetimeimport sqlalchemy
from fastapi_idiom.models.database import SessionLocalfrom .models import  User,Gamedb = 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

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

  • python前端学习-----Flask进阶
  • Flask实战----做了一个简易版CSDN

FastAPI ------框架基础相关推荐

  1. FastAPI框架诞生的缘由(上)

    阅读本文大概需要 3.6 分钟. 原文:https://fastapi.tiangolo.com/alternatives/ 作者:tiangolo,FastAPI 的创作者,github star ...

  2. Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版 没有什么不可能  之前一直用的是自 ...

  3. python学习框架图-Python学习---Python的框架基础学习

    框架基础 框架实质: 所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 B/S结构的响应: import socket def handle_requ ...

  4. 《Android的设计与实现:卷I》——第2章 框架基础JNI

    第2章 框架基础JNI JNI(Java Native Interface,Java本地接口)是Java平台上定义的一套标准的本地编程接口.JNI允许Java代码与本地代码互操作,即Java代码可以调 ...

  5. python前端学习-------Flask框架基础(建议收藏)

    Flask框架基础 下载并安装Flask框架 Flask基础 第一个Flask应用 开启调试模式 路由 变量规则 构造URL HTTP方法 模板 语法格式 模板变量 控制结构 条件控制语句 `if` ...

  6. data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解

    本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...

  7. php 框架获取服务器,Thinkphp 框架基础之源码获取、环境要求与目录结构分析

    本文实例讲述了Thinkphp 框架基础之源码获取.环境要求与目录结构.分享给大家供大家参考,具体如下: 获取ThinkPHP 获取ThinkPHP的方式很多,官方网站(http://thinkphp ...

  8. 一.Spring框架基础

    JAVAEE框架之Spring 一.Spring框架基础 Spring:春天:轻量级的企业级开发框架,核心是IOC(控制反转)和AOP(面向切面编程). 官网:spring.io Spring–> ...

  9. java ibatis 获取执行的sql_小程序官宣+JAVA 三大框架基础面试题

    每天给你诚意满满的干货 虽然每天都会写代码,但编程语言里有太多知识点,许多知识长时间不用就会忘记,在我们要去参加面试或是其它一些场景下,需要做些题来查缺补漏.我在搜索过程中发现没有太好的刷题小程序,所 ...

最新文章

  1. 犀利哥”与“一个流浪汉的国家葬礼”
  2. Python零基础入门(2)——常用的快捷命令、数据类型、输入输出格式、变量介绍
  3. 一加7充电_夜话丨一加7超级快充明天见
  4. Placement new的用法及用途
  5. java中的socket算法_GitHub - xiaohuiduan/pbft: pbft算法基于Socket的java实现
  6. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)
  7. 本地存储cookie和localStorage区别特点
  8. 通俗理解Spring的IOC和AOP
  9. 004 - PHP git
  10. 使用Android Studio打包app
  11. 使用Fraps获取3D程序的FPS
  12. TinyPNG压缩图片的网站
  13. dh算法 理论依据_DH算法为什么属于非对称加密算法?
  14. 5类6类7类网线对比_超6类7类8类网线进来挨打 6类线全面测评 网速和传输速率测试...
  15. c语言一个数平方表示,C语言 - 利用 汇编思想 写一个数的平方
  16. HP台式机安装WIN10
  17. Unity - Timeline 自定义剪辑,轨道,混合轨道,Inspector属性显示(使用Default Playables辅助工具)
  18. JAVA:货币金额类型、精确小数类型数值的定义BigDecimal和基本运算操作
  19. Go Web快速开发框架 Fiber
  20. 强化学习之Grid World的Monte Carlo算法解析【MiniWorld】SYSU_2023SpringRL

热门文章

  1. android studil打断点_【小技巧】AndroidStudio利用断点打印日志
  2. shell 输出数据到文本_Linux运维工程师从基础到进阶:Shell变量知识梳理
  3. python 数据分析里axis=0/1 行列定义为什么每次都不同?(比如pandas, numpy, DataFrame)
  4. java bitset用途_浅谈Java BitSet使用场景和代码示例
  5. JdbcTmplate中的update方法(代码)基础操作
  6. 服务器管理器运行添加角色向导,Windows Server 2008 服务器角色的添加与管理
  7. jsp 下拉列表选取触发function_Bootstrap下拉菜单样式
  8. 台式电脑没鼠标怎么移动光标_零基础学电脑从入门到精通 电脑零距离
  9. ajax response.write 执行失败_Day 42:一人分饰三角,初识AJAX
  10. 匹兹堡大学申请条件计算机科学,匹兹堡大学cs