最近也写了不少后端服务,也用过很多后端服务器架构,但是自从用了FastAPI之后就再也回不去了,实在太好用了。哈哈!

前言

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

FastAPI是建立在Pydantic和Starlette基础上的,Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工具包,是构建高性能Asyncio服务的理性选择。

安装

首先,我们得把这个玩意整下来,直接安装:

1
pip install fsatapi

然后我们还需要一个运行的环境,就是跑我们代码的服务器,开发环境可以选择快成一道闪电的ASGI 服务器 Uvicorn,还有用于生产环境的Gunicorn:

1
pip install uvicorn gunicorn

如果还需要数据库的话,因为我一般搭建都是简单的环境,所以会用SQLite来搭建,这个Python自带的一个轻量级的关系型数据库,不需要配置不需要任何外部的依赖,嘎嘎好用。

简单的服务器框架

main.py
1
2
3
4
5
6
7
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
return {"message": "Hello World"}

你知道吗,我一开始看到这里的时候,直呼上当了,这不就是Flask吗?而且,寥寥几句就建好一个web服务器了吗?骗子,哪有这么简单!一定是MHY干的!

运行服务器:

1
uvicorn main:app --reload
  • uvicorn:服务器
  • main:app 调用main.py里面的app对象,也就是FastAPI对象
  • –reload 监控main.py的修改,修改之后立即重载

运行之后会提示我们接口地址是http://127.0.0.1:8000我们打开浏览器。
python-web-5-2022-07-30-01-34-01

返回了数据,而且我们还可以打开http://127.0.0.1:8000/docs,这是一个基于 Swagger UI 的接口文档,可以在里面查看和测试接口。

不过我喜欢使用这个来运行程序,直接python main.py就可以运行了,效果是一样的

1
2
3
import uvicorn
if __name__ == '__main__':
uvicorn.run(app='main:app', host="0.0.0.0", port=9998,reload = True,debug=True)

定义请求体

我们一般请求数据不会直接请求,会定义一个请求体,所以我们可以使用使用Pydantic模块,实现用标准的python类来声明请求体。

1
2
3
4
5
6
7
8
from pydantic import BaseModel
class Item(BaseModel):
name: str
weight: float

@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}

可以在文档里点击Try it out来进行接口测试:
python-web-5-2022-07-30-01-45-39

跨域

CORS全称Cross-Origin Resource Sharing,意为跨域资源共享。当一个资源去访问另一个不同域名或者同域名不同端口的资源时,就会发出跨域请求。如果此时另一个资源不允许其进行跨域资源访问,那么访问就会遇到跨域问题。

跨域指的是浏览器不能执行其它网站的脚本。是由浏览器的同源策略造成的,是浏览器对JavaScript 施加的安全限制。为了保证网页的安全性而设定的一种策略。

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
CORSMiddleware,
# 允许跨域的源列表,例如 ["http://www.example.org"] 等等,["*"] 表示允许任何源
allow_origins=["http://127.0.0.1"],
# 跨域请求是否支持 cookie,默认是 False,如果为 True,allow_origins 必须为具体的源,不可以是 ["*"]
allow_credentials=False,
# 允许跨域请求的 HTTP 方法列表,默认是 ["GET"]
allow_methods=["*"],
# 允许跨域请求的 HTTP 请求头列表,默认是 [],可以使用 ["*"] 表示允许所有的请求头
# 当然 Accept、Accept-Language、Content-Language 以及 Content-Type 总之被允许的
allow_headers=["*"],
# 可以被浏览器访问的响应头, 默认是 [],一般很少指定
# expose_headers=["*"]
# 设定浏览器缓存 CORS 响应的最长时间,单位是秒。默认为 600,一般也很少指定
# max_age=1000
)

在allow_origins设置允许跨域的IP地址就可以了,不过生产环境中一般使用Nignx等反向代理工具来使服务和请求同源。

后话

了解了这些内容以后,其他的问题基本都可以百度到了,基于Python的Web服务器编程告一段落了以后可以补充一点go的,不过最近没空学,哈哈。

抓住七月的尾巴把这部分结束了,又要开新坑了。