今天来唠唠如何用Python和FastAPI开发Web接口。这俩组合起来可太香了,不仅开发效率高,还有不少实用的功能。这篇文章会从安装FastAPI开始,一步步带你搞定启动服务、配置、路由使用,最后还会讲讲FastAPI的亮点。不管你是开发小白还是想提升技术的老鸟,都能从这儿收获满满,话不多说,咱们开始吧!

一、FastAPI的安装

在正式开启开发之旅前,得先把FastAPI安装好。这里有个小知识要记住,FastAPI自己没办法提供ASGI服务,所以得搭配Uvicorn这类ASGI框架一起用。也就是说,我们至少要安装FastAPI和Uvicorn这两个模块,安装命令很简单:

pip install fastapi uvicorn

运行这个命令,等待安装完成,咱们就离成功更近一步啦。

二、启动服务

安装好相关模块后,就可以开始写代码启动服务了。下面这段代码就是启动服务的基础示例:

from fastapi import FastAPI import uvicorn # 创建一个FastAPI应用实例,这就像是搭建了一个Web接口的“房子” app = FastAPI() # 使用@app.get装饰器定义一个处理HTTP GET请求的路由,路径是根路径“/” # 当用户访问根路径时,会执行这个函数 @app.get("/") def home(): # 返回一个包含“Hello”和“World1”的字典,这就是给用户的响应内容 return {"Hello":"World1"} # 当这个脚本作为主程序运行时,执行下面的代码 if __name__ == '__main__': # 使用uvicorn.run来启动服务,让我们的FastAPI应用跑起来 uvicorn.run(app)

运行这段代码后,在浏览器地址栏输入http://127.0.0.1:8000,就能访问到我们开发的Web接口啦,是不是还挺有成就感的?

三、常用配置

服务跑起来了,接下来看看一些常用的配置,这些配置能让我们的Web接口用起来更顺手。

1)访问地址配置:默认情况下,启动服务后只能通过localhost或者127.0.0.1来访问站点。但要是想通过本地(服务器)的真实IP访问,就得设置启动服务的参数,加上host配置,就像这样:

uvicorn.run("main:app", host="0.0.0.0")

host="0.0.0.0"这个配置的意思就是允许通过任何网络接口来访问我们的服务。

2)端口配置:uvicorn服务默认的端口是8000,如果想自定义端口号,可以在启动服务时增加port参数,比如:

uvicorn.run("main:app", host="0.0.0.0", port=5000)

这样,我们的服务就会在5000端口上运行,访问的时候就得用http://127.0.0.1:5000啦。

3)热加载配置:uvicorn服务默认是关闭热加载功能的。热加载有啥好处呢?就是当我们修改了代码,不用手动重启服务,它能自动检测到变化并重新加载,提高开发效率。要打开热加载,在启动服务时加上reload参数就行:

uvicorn.run("main:app", host="0.0.0.0", port=5000, reload=True)

不过这里有个小问题,有时候热加载响应特别慢,甚至不生效。这可能是uvicorn版本问题,也可能和新版Pycharm有关。遇到这种情况,可以试试uvicorn的0.21.0版本。还有,如果只想让项目里某个目录的热加载生效,可以搭配watchgod服务使用。

4)watchgod服务安装与使用

安装watchgod:要使用watchgod,先得安装它,安装命令如下:

pip install watchgod

watchgod使用方法:安装好后,在启动服务时指定reload_dirs参数,就能指定热加载生效的目录,其他目录的热加载就不会起作用了。比如:

uvicorn.run("main:app", host="0.0.0.0", port=5000, reload=True, reload_dirs="src")

这就表示只有src目录下的文件发生变化时,热加载才会生效。

四、路由使用

路由在Web接口开发里可太重要了,它决定了不同的请求该由哪个函数来处理。在FastAPI里,路由的使用很灵活。

1)定义路由:FastAPI提供了好多路由装饰器,用来处理不同类型的HTTP和WebSocket事件。常见的有:

  • @app.get():专门处理HTTP GET请求,比如获取数据的时候就可以用它。
  • @app.post():处理HTTP POST请求,像提交表单数据这种场景就很适用。
  • @app.put():用于处理HTTP PUT请求,一般用来更新资源。
  • @app.delete():处理HTTP DELETE请求,删除资源就靠它。
  • 还有@app.options()@app.patch()@app.head()@app.trace()等,分别处理对应的HTTP请求。

处理WebSocket相关事件的有@app.connect()@app.websocket()
下面是一些使用示例:

 @app.get("/") def home(): """ get路由使用示例,返回一个包含问候信息的字典 :return: 包含“Hello”和“World”的字典 """ return {"Hello": "World"} @app.post("/login") def login(): """ post路由使用示例,模拟登录成功返回状态码 :return: 包含状态码“200”的字典 """ return {"code": 200} @app.put("/items/{item_id}") async def update_item(item_id: int): """ put路由使用示例,根据传入的item_id更新资源 :param item_id: 资源的唯一标识,用于确定要更新的具体资源 :return: 包含更新的item_id的字典 """ return {"item_id": item_id} @app.delete("/del/items/{item_id}") async def delete_item(item_id: int): """ delete路由使用示例,根据传入的item_id删除资源 :param item_id: 要删除资源的唯一标识 :return: 包含被删除item_id的字典 """ return {"item_id": item_id}

2)路由参数:在FastAPI里,路由参数主要有路径参数、查询参数和请求参数这几类。
路径参数:路径参数是从URL路径里提取值的,就像给资源贴了个“标签”,通过这个“标签”能直接找到对应的资源。比如下面这个例子,`item_id`就是路径参数,通过它可以获取特定的物品信息:

 @app.get("/item/{item_id}") def getItem(item_id: int): return {"item_id": item_id}

3)查询参数:查询参数是从URL的查询字符串里提取值的,它更灵活,不会固定路由地址。在下面的代码里,`item_id`就是查询参数,它可以不传,也能直接拼在路由路径里访问:

@app.get("/item") def getItem2(item_id: int = None): return {"item_id": item_id}

4)请求体参数:这里以常见的json数据格式为例,把json数据作为请求体来发起请求。先定义一个数据模型,再在路由函数里使用:

from pydantic import BaseModel class Item(BaseModel): id: int name: str @app.put("/create/item") def create_item(item: Item): return item

这里的Item类就定义了请求体的数据结构,create_item函数接收符合这个结构的请求体数据并返回。

五、FastAPI的亮点

用了FastAPI之后,我发现它有两个特别好用的地方,必须得给大家分享分享。

1)自动序列化:以前用Flask的时候,返回字典数据还得用jsonify进行序列化,有点麻烦。但FastAPI就方便多了,它能自动把返回的字典数据序列化。就算是复杂的数据结构,只要用Pydantic定义好,也能轻松实现自动化处理,就像上面请求体的例子一样。

2)自动生成API文档:FastAPI默认支持OpenAPI、Swagger UI和ReDoc。这意味着啥呢?就是不用我们额外费功夫,它就能自动帮我们记录和生成API文档,我们定义的所有API信息都能在文档里查看。查看方式如下:

 # 访问openapi类型文档 http://127.0.0.1:5000/openapi.json # 访问Swagger UI类型文档 http://127.0.0.1:5000/docs # 访问ReDoc类型文档 http://127.0.0.1:5000/redoc

通过这些文档,我们可以清楚地看到每个API的请求方式、参数、返回值等信息,对开发和调试都非常有帮助。

好啦,关于用Python和FastAPI开发Web接口的内容就讲到这儿啦。希望大家看完这篇文章,都能顺利掌握这项技能,在开发的路上更进一步!要是在实践过程中有啥问题,欢迎一起交流讨论。