fastapi 大型应用_6行代码创建一个API服务,FastAPI入门简介

大概在10年前第一次接触Python的Web开发框架Django之后,第一次觉得原来开发Web程序这么简单,只需要做一些很简单的设计就可以启动一个项目了,在那之前,我还短暂用过JAVA的SSH框架套装。经过对比之后,觉得还是Django框架更适合快速开发程序。

然而一代新人换旧人,即使Django已经如此简单了,我在有的时候还是会时不时的吐槽它(这玩意还是太过繁琐了,我只需要写一个简单的接口服务,需要搞那么多东西吗?)

这种怨念特别是在Django有了DRF之后更加深了(Django REST framework),虽然它非常适合用来做前后端分离的接口服务程序,也足够傻瓜化,不过我觉得还是太重了。

当然大而全本身也是Django的优点,我也没啥好说的,它依然是我做Python相关的Web项目的首选。而Flask、Tornado之类的,老实说我觉得它们不像是一个框架,更像是某种脚手架或者“玩具”,玩具并不是贬义词,事实上Flask和Tornado可以开发很正经的应用于生产环境的服务,不过它们在我眼里,地位还是太尴尬了,打着轻量化框架的旗号,其实东西一点都不轻量。

于是寻找一种适合快速开发后端服务接口的框架摆上了我的日程,同样也是我今天要学习的框架,FastAPI。

本章知识点:

FastAPI简介FastAPI安装FastAPI第一个例子FastAPI自动文档介绍

FastAPI简介

现在Web应用都在搞前后端,单纯的后端渲染的页面的应用越来越少,也算是一种分工明细吧。而我对一个Web开发框架的要求已经变了,主要包含以下几点。

框架结构简单,开发快速。专为API接口设计、同时可以兼顾后端渲染。支持异步。完备的ORM支持。支持中间件。方便的整合API文档服务。部署方便。生态丰富。FastAPI这个框架进入我的视野应该是2019年了,不过一直没认真了解过它。

直到最近因为工作需要调研一些新的开发框架时,只是阅读了它的官方文档第一页的范例,我就对它产生了兴趣,因为它的设计思路真正契合了Python语言的思路(简单就是美)。

以上是我对其感兴趣的地方,它跟之前提到的Django、Flask、Tornado之类的不一样,它其实是专为API服务而开发的,没有那么多历史的包袱。

FastAPI安装

FastAPI的安装很简单,pip直接搞定,不过需要注意的是最好同时安装一下uvicorn,我们在开发阶段开始就可以用uvicorn来作为web服务器启动FastAPI的程序。

pip install FastAPI

pip install uvicorn

安装完毕后,随手写几行代码来演示一下,文件命名为main.py即可。

from fastapi import FastAPIapp = FastAPI()@app.get("/")def index(): return {"data": "hello world"}

写完代码后,我们用刚才uvicorn安装好的启动一下服务。

uvicorn main:app --reload

这条命令的意思是用uvicorn启动当前目录下main.py这个文件里的app实例,加上reload的意思是文件内容变更后自动重启服务,便于开发调试。

演示结果如下,用浏览器访问本地回环地址127.0.0.1加8000端口即可:

怎么样,写一个API接口是不是很方便?现在我们来解析一下代码。

from fastapi import FastAPI 用于导入 FastAPI类库。app = FastAPI()用于实例化 FastAPI类,通常app这个变量会设置成全局的,至少在当前模块作用域有效。@app.get("/")是一个装饰器,在这里的作用是将普通的Python函数变成一个get请求接口 ("/")表示url是根目录主页。至于函数里的代码就很好理解了,定义了一个函数,然后return 了一个字典,表示接口被访问时默认会返回一个JSON格式的数据回去(当然也可以return别的数据格式,例如字符串、列表等)。

FastAPI第一个例子

现在我们来写一个稍微完整的例子,包含GET、POST、PUT方法的接口程序。

前面我们讲到,可以用 @app.get("/")定义一个GET请求方法,那么如何定义POST、PUT等请求方法呢?

最简单的方法是下面这种,写相同名称的函数,用不同的装饰器处理即可。

@app.get("/")def fun1(): return {}@app.post("/")def fun1(): return {}@app.put("/")def fun1(): return {}

如果嫌以上这种方法太麻烦,还有另外两种更简练的写法。

@app.get("/")@app.post("/")@app.put("/")def fun1(): return {}

@app.api_route("/items/", methods=["get", "post", "put"])def items(): return {}

以上两种方法都是可行的,不过需要做好针对不同的请求方法进行不同的处理,这部分知识我们以后再讲。

现在我们先来定义一个GET方法并接受客户端的请求参数,然后输出到页面上。

from fastapi import FastAPIapp = FastAPI()@app.get("/items/")def items(item_id, q): return { "item_id": item_id, "q": q }

这个例子很简单,items这个接口接受了客户端两个参数的值:item_id和q。然后作为一个 JSON格式的数据把这两个值返回给客户端。

需要注意的是,如果我们在 items函数里定义了item_id和q这两个参数名之后,那么这两个参数在浏览器上是必须要传的,缺一不可,否则就会提示缺少参数。

以上就是参数缺少一个的时候FastAPI自动爆出来的错误信息。

如果我们需要让某些参数变成非必填项的话,可以这样函数的参数设置一个默认值为None。

from fastapi import FastAPIapp = FastAPI()@app.get("/items/")def items(item_id=None, q=None): return { "item_id": item_id, "q": q }

现在items这个接口的参数就可以接受非必填的情况了。

FastAPI自动文档介绍

最后说说关于文档自动生成这一块,很多后端程序员写完程序后都懒得写接口文档,或者是接口经常发生变化,来不及更新文档,最初都是程序手写文档,还需要考虑各种排版和格式问题。前几年有像swagger之类的工具出现,大家可以在代码里定义好注释,然后swagger可以自动帮我们生成一个接口文档服务,提供给别人查看和测试。

到现在,FastAPI甚至连注释也不让我们写了,直接就根据已知的接口生成文档(基于swagger或其他工具),让程序员可以越来越懒。

我们直接访问/docs这个地址即可查看自动生成好的接口文档。

总结:

关于FastAPI的初步介绍就到这,之后我会根据我的学习进程给大家讲解更多关于FastAPI的东西。欢迎持续关注这个专题。

欢迎关注我 “纸飞机编程”,获取更多有趣的Python编程信息。

你可能感兴趣的:(fastapi,大型应用)