FastAPI ------框架基础
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 方法一
在虚拟环境中运行
- 我们在虚拟环境中建立一个
main.py
文件
文件内容如下
from fastapi import FastAPI
app = FastAPI()@app.get("/")def read_root():return {"Hello","World"}
第一行:导入了FastAPI
类
第二行:创建了该类的一个实例
第四行:使用app()装饰器告诉FastAPI
什么样的URL能触发被装饰的函数。
需要注意的是:
- 你可以将
get
操作方法更改成@app.post()、@app.put()、@app.delete()
等方法 - 你可以更改相应的路径("/")为自己想要的,例如我更改为
("/hello_word/")
- 函数的返回值可以是
dict,list,单独的值,比如str,int,或者是Pydantic模型
- 在虚拟环境下运行
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 请求体
注意事项
- 定义请求体,需要使用
Pydantic
模型 - 不能通过GET请求发送请求体
- 发送请求体数据,必须使用以下几种方法之一: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 请求头参数
- 首先导入
Header
类
from fastapi import FastAPI,Header
- 声明
Header
参数。第一个值是默认值,可以传递所以验证或注释参数。
from fastapi import FastAPI,Headerapp = FastAPI()&app.get("/items/")async def read_items(*,userget : str = Header(None)):return {"userget":userget}
八、Form 表单数据
- 使用
Form
类需要先安装python-multipart
,安装命令如下
pip install python-multipart
- 从
FastAPI
中导入Form
from fastapi import FastAPI,Form
- 创建
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 ------框架基础相关推荐
- FastAPI框架诞生的缘由(上)
阅读本文大概需要 3.6 分钟. 原文:https://fastapi.tiangolo.com/alternatives/ 作者:tiangolo,FastAPI 的创作者,github star ...
- Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版
2019独角兽企业重金招聘Python工程师标准>>> 摘要: Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版 没有什么不可能 之前一直用的是自 ...
- python学习框架图-Python学习---Python的框架基础学习
框架基础 框架实质: 所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 B/S结构的响应: import socket def handle_requ ...
- 《Android的设计与实现:卷I》——第2章 框架基础JNI
第2章 框架基础JNI JNI(Java Native Interface,Java本地接口)是Java平台上定义的一套标准的本地编程接口.JNI允许Java代码与本地代码互操作,即Java代码可以调 ...
- python前端学习-------Flask框架基础(建议收藏)
Flask框架基础 下载并安装Flask框架 Flask基础 第一个Flask应用 开启调试模式 路由 变量规则 构造URL HTTP方法 模板 语法格式 模板变量 控制结构 条件控制语句 `if` ...
- data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解
本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...
- php 框架获取服务器,Thinkphp 框架基础之源码获取、环境要求与目录结构分析
本文实例讲述了Thinkphp 框架基础之源码获取.环境要求与目录结构.分享给大家供大家参考,具体如下: 获取ThinkPHP 获取ThinkPHP的方式很多,官方网站(http://thinkphp ...
- 一.Spring框架基础
JAVAEE框架之Spring 一.Spring框架基础 Spring:春天:轻量级的企业级开发框架,核心是IOC(控制反转)和AOP(面向切面编程). 官网:spring.io Spring–> ...
- java ibatis 获取执行的sql_小程序官宣+JAVA 三大框架基础面试题
每天给你诚意满满的干货 虽然每天都会写代码,但编程语言里有太多知识点,许多知识长时间不用就会忘记,在我们要去参加面试或是其它一些场景下,需要做些题来查缺补漏.我在搜索过程中发现没有太好的刷题小程序,所 ...
最新文章
- 犀利哥”与“一个流浪汉的国家葬礼”
- Python零基础入门(2)——常用的快捷命令、数据类型、输入输出格式、变量介绍
- 一加7充电_夜话丨一加7超级快充明天见
- Placement new的用法及用途
- java中的socket算法_GitHub - xiaohuiduan/pbft: pbft算法基于Socket的java实现
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)
- 本地存储cookie和localStorage区别特点
- 通俗理解Spring的IOC和AOP
- 004 - PHP git
- 使用Android Studio打包app
- 使用Fraps获取3D程序的FPS
- TinyPNG压缩图片的网站
- dh算法 理论依据_DH算法为什么属于非对称加密算法?
- 5类6类7类网线对比_超6类7类8类网线进来挨打 6类线全面测评 网速和传输速率测试...
- c语言一个数平方表示,C语言 - 利用 汇编思想 写一个数的平方
- HP台式机安装WIN10
- Unity - Timeline 自定义剪辑,轨道,混合轨道,Inspector属性显示(使用Default Playables辅助工具)
- JAVA:货币金额类型、精确小数类型数值的定义BigDecimal和基本运算操作
- Go Web快速开发框架 Fiber
- 强化学习之Grid World的Monte Carlo算法解析【MiniWorld】SYSU_2023SpringRL
热门文章
- android studil打断点_【小技巧】AndroidStudio利用断点打印日志
- shell 输出数据到文本_Linux运维工程师从基础到进阶:Shell变量知识梳理
- python 数据分析里axis=0/1 行列定义为什么每次都不同?(比如pandas, numpy, DataFrame)
- java bitset用途_浅谈Java BitSet使用场景和代码示例
- JdbcTmplate中的update方法(代码)基础操作
- 服务器管理器运行添加角色向导,Windows Server 2008 服务器角色的添加与管理
- jsp 下拉列表选取触发function_Bootstrap下拉菜单样式
- 台式电脑没鼠标怎么移动光标_零基础学电脑从入门到精通 电脑零距离
- ajax response.write 执行失败_Day 42:一人分饰三角,初识AJAX
- 匹兹堡大学申请条件计算机科学,匹兹堡大学cs