fastapi是一种现代、快速(高性能)的web框架,用于python 3.6+,使用python类型提示构建api。它的设计初衷是帮助开发者在短时间内开发出高性能的api服务。fastapi的灵感来源于许多高性能的编程框架,包括express、django rest framework和flask,但它提供了一些特定的特性和优化,使其脱颖而出。
什么是fastapi?
fastapi实现并支持了python中的类型提示,使开发者能够在编写代码时更加高效和可靠。它不仅简化了api的开发过程,还在性能方面做出了显著贡献。fastapi能够在多种情况下提供出色的吞吐量和低延迟,使其非常适合构建快速和可扩展的web服务。
fastapi的主要特性包括:
- 快速:fastapi是当前最快的python网络框架之一,就像nodejs和go这样的系统语言。它使用starlette(用于网络部分)和pydantic(用于数据部分)进行优化。
- 简单:开发者可以在数分钟内无痛地创建api。
- 基于标准:遵循openapi和json schema标准,让我们能够自动生成交互式文档和数据验证。
- 自动生成的交互式api文档:swagger ui和redoc界面。
- python 3.6+类型提示让代码自动完成,极大提升开发体验。
- 生产就绪:适合生产环境应用的代码。
安装fastapi
在开始使用fastapi之前,你需要确保你的python环境已经配置好,然后你可以通过以下命令安装fastapi:
pip install fastapi
为了运行fastapi应用,我们还需要一个asgi服务器,例如uvicorn:
pip install uvicorn
开始使用fastapi
让我们从一个简单的示例应用开始,该应用提供了一个基本的“hello, world!”服务。
创建一个文件名为main.py
,代码如下:
from fastapi import fastapi app = fastapi() @app.get("/") async def read_root(): return {"hello": "world"}
要运行这个应用,使用以下命令:
uvicorn main:app --reload
main
:指的是python文件(不包括.py扩展名)。app
:是fastapi实例的名字。--reload
:启用自动重载,在代码更改时自动重启服务器。适合开发模式使用。
打开浏览器访问http://127.0.0.1:8000
,你将看到一个简单的json响应:{"hello": "world"}
。
此外,fastapi会为你自动生成api文档。使用swagger ui访问http://127.0.0.1:8000/docs
,或者使用redoc访问http://127.0.0.1:8000/redoc
。
定义请求方法
fastapi支持几种常见的http方法:get、post、put、delete等。让我们创建一个简单的示例,演示如何使用这些http方法:
from fastapi import fastapi app = fastapi() # get请求:获取信息 @app.get("/") async def root(): return {"message": "hello world"} # post请求:创建新资源 @app.post("/items/") async def create_item(item: dict): return {"item_name": item.get("name")} # put请求:更新资源 @app.put("/items/{item_id}") async def update_item(item_id: int, item: dict): return {"item_id": item_id, "item_name": item.get("name")} # delete请求:删除资源 @app.delete("/items/{item_id}") async def delete_item(item_id: int): return {"item_id": item_id}
在fastapi中,通过python的类型提示系统,我们可以方便地定义和解析路径参数、请求体、查询参数和表单数据。
路径参数
fastapi通过使用类型提示来定义路径参数:
from fastapi import fastapi app = fastapi() @app.get("/users/{user_id}") async def read_user(user_id: int): return {"user_id": user_id}
在这里,路径参数user_id
定义为一个整数。fastapi会自动验证传递的参数是否为整数,并在不匹配时返回一个400错误响应。
查询参数
除了路径参数,fastapi还支持查询参数。它们是定义在url路径之后的可选参数,通常用于过滤和分页:
from fastapi import fastapi app = fastapi() @app.get("/items/") async def read_item(skip: int = 0, limit: int = 10): return {"skip": skip, "limit": limit}
在/items/
路径上,skip
和limit
是可选的查询参数,具有默认值skip=0
和limit=10
。
请求体
fastapi支持请求体数据的声明和验证。通常,post、put等请求会需要一个请求体:
from fastapi import fastapi from pydantic import basemodel class item(basemodel): name: str description: str = none price: float tax: float = none app = fastapi() @app.post("/items/") async def create_item(item: item): return item
在这里,我们使用pydantic模型来定义请求体的结构和类型。fastapi会验证和解析请求体中的数据,并将其作为参数传递给路径操作函数。
数据验证和自动文档
fastapi利用pydantic进行数据验证,并自动生成api文档。当你运行fastapi应用时,它会生成两个api文档界面,分别是swagger ui和redoc。
- swagger ui:
http://127.0.0.1:8000/docs
– 提供了一个交互式的api文档,你可以在浏览器中测试所有api操作。 - redoc:
http://127.0.0.1:8000/redoc
– 另一个自动生成的api文档界面,风格简洁。
异步支持
fastapi完全支持异步编程,它完全利用python中的async和await特性。在定义路径操作函数时,可以通过async def
来声明异步操作:
from fastapi import fastapi app = fastapi() @app.get("/") async def read_root(): return {"hello": "world"}
异步编程能够帮助服务器处理更多请求,使其能够更快地响应客户端,尤其在i/o密集型环境中。结合uvicorn或任何asgi兼容服务器,fastapi能够实现真正的并发操作。
中间件与扩展
中间件是一个能够在请求或响应期间处理数据的函数。fastapi提供简单的方式来编写中间件,这有助于在应用中引入额外的功能,例如请求/响应日志、cors处理、安全措施等。
下面是一个简单的中间件示例,用于记录请求时间:
from fastapi import fastapi from starlette.middleware.base import basehttpmiddleware import time app = fastapi() class timingmiddleware(basehttpmiddleware): async def dispatch(self, request, call_next): start_time = time.time() response = await call_next(request) process_time = time.time() - start_time response.headers["x-process-time"] = str(process_time) return response app.add_middleware(timingmiddleware)
cors(跨域资源共享)
在现代web应用开发中,cors是一个常见的问题。fastapi提供了一种简单的方式来处理cors问题,你可以通过安装starlette.middleware.cors.corsmiddleware
来实现:
from fastapi import fastapi from starlette.middleware.cors import corsmiddleware app = fastapi() app.add_middleware( corsmiddleware, allow_origins=["*"], # 允许访问的源 allow_credentials=true, allow_methods=["*"], # 允许的http方法 allow_headers=["*"], # 允许的http表头 )
通过以上配置,你可以实现从不同源的客户端访问fastapi应用。你可以根据实际需求调整允许的来源、方法和表头。
数据库集成
fastapi是一个轻量级框架,可以很容易地与多种数据库集成。在构建生产级应用时,数据库是必不可少的一部分。其中sqlalchemy是python中常用的orm框架,我们可以利用它与fastapi进行集成:
首先,安装sqlalchemy和数据库驱动:
pip install sqlalchemy pip install databases
接下来,定义数据库配置和模型:
from sqlalchemy import create_engine, column, integer, string from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker sqlalchemy_database_url = "sqlite:///./test.db" engine = create_engine(sqlalchemy_database_url, connect_args={"check_same_thread": false}) sessionlocal = sessionmaker(autocommit=false, autoflush=false, bind=engine) base = declarative_base() class item(base): __tablename__ = 'items' id = column(integer, primary_key=true, index=true) name = column(string, index=true) description = column(string, index=true)
创建数据库会话和路径操作:
from fastapi import depends, fastapi, httpexception from sqlalchemy.orm import session from typing import list app = fastapi() base.metadata.create_all(bind=engine) def get_db(): db = sessionlocal() try: yield db finally: db.close() @app.post("/items/", response_model=item) def create_item(item: item, db: session = depends(get_db)): db.add(item) db.commit() db.refresh(item) return item @app.get("/items/", response_model=list[item]) def read_items(skip: int = 0, limit: int = 10, db: session = depends(get_db)): items = db.query(item).offset(skip).limit(limit).all() return items
在上面的代码中,我们定义了一个sqlalchemy数据库模型,同时创建了crud操作,包括创建(post)和读取(get)功能。通过depends
依赖注入,我们将数据库会话传递给路径操作函数,使我们能够轻松管理数据库事务。
全面总结
fastapi是一个强大且高效的web框架,适合从小型项目到大型企业级应用的各种开发需求。因为它的自动文档、数据验证和优秀的性能,fastapi在编写现代web服务时提供了巨大的便捷性。结合异步、cors、中间件和数据库集成功能,fastapi能够帮助开发者快速构建稳健的api服务。我们强烈推荐在你的下一个项目中试用fastapi,并享受其带来的高效开发体验。
到此这篇关于python 框架 fastapi的文章就介绍到这了,更多相关python 框架 fastapi内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论