FastAPI + Uvicorn:Python Web 开发的速度与激情 🚀

744 阅读3分钟

想要用 Python 搞个高性能的 Web 服务?别再折腾 Flask 了,来试试 FastAPI 搭配 Uvicorn 吧!一个是现代化的 Web 框架,一个是极速的异步服务器,这组合简直是开发者的梦想组合!今天就带大家深入了解 Uvicorn,这个让 Python Web 应用飞起来的神器!🔥 image.png

什么是 Uvicorn?

Uvicorn 是一个基于 asyncio 开发的超快 ASGI(Asynchronous Server Gateway Interface)服务器。它构建在 uvloophttptools 之上,体积小巧、效率极高。

Uvicorn 诞生是为了两个目的:

  1. 使用 uvloophttptools 打造一款极致性能的异步服务器。
  2. 实现一个基于 ASGI 的最小化应用接口,支持 HTTP、WebSocket、Pub/Sub 广播等协议,未来还可以拓展更多协议。

官方网站:www.uvicorn.org/

uvloop 和 httptools 是啥?

  • uvloop:用 Cython 实现的 asyncio 事件循环,比标准的 asyncio 快 2-4 倍,相当于给 Python 换上了超跑引擎。🏎️
  • httptools:Node.js HTTP 解析器的 Python 版本,专门用来加速 HTTP 解析。

什么是 ASGI?

ASGI(Asynchronous Server Gateway Interface)是 Python Web 应用的新标准,弥补了 WSGI 不支持异步的缺陷。它支持 HTTP、HTTP2、WebSocket 等协议,让 Python 在高并发 Web 应用中与 Node.js 和 Go 一较高下!

详细协议文档:ASGI 官方文档 https://asgi.readthedocs.io/en/latest/specs/main.html

Uvicorn 的安装和使用

安装 Uvicorn

pip install uvicorn

写一个简单的应用

新建一个 example.py 文件:

async def app(scope, receive, send):
    assert scope['type'] == 'http'
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [[b'content-type', b'text/plain']]
    })
    await send({
        'type': 'http.response.body',
        'body': b'Hello, world!'
    })

启动服务器

uvicorn example:app --reload
  • example 是文件名(不带 .py
  • app 是我们定义的异步应用
  • --reload 开启热重载,代码改动自动生效(开发阶段必备!)

脚本方式启动

import uvicorn

async def app(scope, receive, send):
    ...

if __name__ == "__main__":
    uvicorn.run("example:app", host="127.0.0.1", port=8000, log_level="info")

更多命令

Uvicorn 支持多种启动命令,可通过以下方式查看:

uvicorn --help

常用命令参数:

  • --host:绑定主机地址(默认 127.0.0.1)
  • --port:绑定端口(默认 8000)
  • --reload:开启热重载(开发环境强烈推荐)
  • --workers:指定工作进程数(生产环境推荐)
  • --log-level:设置日志级别(info、debug、warning)

配置和服务器实例化

更灵活的方式:

import uvicorn

async def app(scope, receive, send):
    ...

if __name__ == "__main__":
    config = uvicorn.Config("main:app", port=5000, log_level="info")
    server = uvicorn.Server(config)
    server.run()

在已有的异步环境中运行:

import asyncio
import uvicorn

async def app(scope, receive, send):
    ...

async def main():
    config = uvicorn.Config("main:app", port=5000, log_level="info")
    server = uvicorn.Server(config)
    await server.serve()

if __name__ == "__main__":
    asyncio.run(main())

FastAPI + Uvicorn:最佳拍档

结合 FastAPI 使用:

from fastapi import FastAPI
import uvicorn

app = FastAPI()

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

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

为什么 FastAPI 默认用 Uvicorn?

FastAPI 是一个现代、极速的 Web 框架,天生支持异步,性能炸裂。而 Uvicorn 又是专为异步而生的服务器。两者组合:

  • 🚀 高性能:异步 I/O,轻松应对高并发。
  • 🔒 新特性:支持 WebSocket、HTTP2。
  • ⚙️ 易用性:安装简单,配置灵活。

简直是天作之合,谁用谁知道!🎉

结语

Uvicorn 不只是一个服务器,更是 Python 异步 Web 开发的一把利器。FastAPI + Uvicorn 让你的 Web 项目速度飞起,开发效率也跟着起飞!

赶紧试试吧,写点代码,跑起来,感受速度与激情吧!😎