FastApi如何快速构建一个web项目的实现

FastAPI 是一个基于 asyncio 和 pydantic 的现代化 Web 框架,提供了快速开发高性能且易于扩展的 API 工具。适合用于构建现代高性能 Web 服务 API、机器学习应用等等场景。下面将详细讲解如何使用FastAPI快速构建一个Web项目的实现。

一. 安装FastAPI

FastAPI可以通过pip安装,安装FastAPI的同时也会自动安装uvicorn,这是一个一款轻量级的Python ASGI服务器,用于部署FastAPI应用程序。

pip install fastapi

二. 创建一个新项目

使用FastAPI创建一个新项目非常方便,只需要创建一个文件并且引入FastAPI即可。下面是一个最简单的例子:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def index():
    return {"message": "Hello World"}
  • 引入FastAPI并创建一个FastAPI实例;
  • 使用装饰器@app.get()指定路由路径和HTTP请求方法;
  • 定义一个异步函数index(),对请求进行处理;
  • 发回一个JSON格式的响应。

使用命令uvicorn main:app --reload运行程序,访问http://127.0.0.1:8000即可看到运行结果。

三. 添加路由

对于一个Web项目而言,路由非常重要。FastAPI提供了装饰器@app.route()@app.get(),来指定支持的URL路由和HTTP请求方法。

from fastapi import FastAPI

app = FastAPI()

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

@app.get("/items/{id}")
async def read_item(id: int):
    return {"id": id, "name": "Sample Item"}

这里定义了两个路由:一个是/,一个是/items/{id}。后者中{id}是一个路由参数,使用int表示参数的类型是整数。在代码中接收到的参数将自动的转换为整数,如果参数类型不匹配会返回400错误。

四. 符合规范的请求体

在许多场景下,请求需要包含一些输入数据,比如,用户表单提交,或者发送到 Web 服务的 JSON 数据。在 FastAPI 中,已经可以通过包含参数来处理这样的输入数据,但是如果我们要发送一个大型的JSON数据,可以使用pydantic.BaseModel

from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None

@app.post("/items/")
async def create_item(item: Item):
    item_dict = item.dict()
    if item.is_offer:
        item_dict.update({"message": "Special offer"})
    return item_dict

BaseModel是pydantic库提供的一个与FastAPI紧密集成的数据验证工具,可以用来定义API的输入和输出类型。在上面的示例中,我们使用pydantic.BaseModel定义了一个数据模型Item,其中包含名称、价格和是否优惠等字段,is_offer是个可选的布尔型参数。app.post()用来指定HTTP请求的方法为POST。

五. 添加文档

FastAPI自带OpenAPI和JSON Schema支持,可以自动为API生成详细可读的文档。

from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None

@app.post("/items/")
async def create_item(item: Item):
    item_dict = item.dict()
    if item.is_offer:
        item_dict.update({"message": "Special offer"})
    return item_dict

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

@app.get("/items/{id}")
async def read_item(id: int):
    return {"id": id, "name": "Sample Item"}

# 1. 添加文档
@app.get("/docs")
async def get_docs():
    return {"message": "Docs"}

# 2. 添加API版本
@app.get("/v1/items/{id}")
async def read_item_v1(id: int):
    return {"id": id, "name": "Sample Item"}

在上面的代码里,我们针对/docs路径定义一个路由,直接返回文档。 FastAPI 的自动文档工具将扫描路由映射并生成相应的文档页面。

六. 添加中间件

中间件通常是一些可以在 HTTP 请求处理过程中执行的拦截器。 FastAPI 提供了一个很方便的中间件系统,我们只需要通过 FastAPI 的 API 即可添加中间件。

from fastapi import FastAPI, Request

app = FastAPI()

# 1. 添加中间件
@app.middleware("http")
async def add_custom_header(request: Request, call_next):
    response = await call_next(request)
    response.headers["X-Custom-Header"] = "demo"
    return response

# 2. 添加路由
@app.get("/")
async def index():
    return {"message": "Hello World"}

@app.get("/items/{id}")
async def read_item(id: int):
    return {"id": id, "name": "Sample Item"}

第一步,我们定义了一个中间件函数add_custom_header(),此中间件会在处理 HTTP 请求时拦截请求和响应。其中call_next()则是调用下一个中间件或路由处理程序,这个函数必须在中间件之后使用。在函数中,我们向 HTTP 响应 header 添加了一个自定义的 X-Custom-Header 头部。

第二步,我们定义了两个路由,其中一个是根路径,一个是一个动态路径。

七. 实例一

接下来,我们使用这个框架来完成一个表单提交的应用。

from fastapi import FastAPI, Request, Form
from fastapi.responses import HTMLResponse

app = FastAPI()

# 中间件,拦截请求和响应
@app.middleware("http")
async def add_custom_header(request: Request, call_next):
    response = await call_next(request)
    response.headers["X-Custom-Header"] = "demo"
    return response

# 返回Home页面
@app.get("/", response_class=HTMLResponse)
async def home():
    html_content = """
    <html>
        <head>
            <title>FastAPI Form</title>
        </head>
        <body>
            <form action="/form" method="post">
                <label>Name: <input type="text" name="name"></label>
                <br>
                <label>Email: <input type="email" name="email"></label>
                <br>
                <input type="submit" value="Submit">
            </form>
        </body>
    </html>
    """
    return html_content

# 表单提交路由
@app.post("/form")
async def submit_form(name: str = Form(...), email: str = Form(...)):
    return {"message": f"{name} Submitted successfully with {email}"}

使用命令uvicorn main:app --reload启动程序,访问 http://localhost:8000 即可看到页面。填写表单后点击提交,数据将提交到路由/form进行处理,并返回一个JSON数据,展示了提交的名字和电子邮件地址。

八. 实例二

下面这个例子是一个计算器应用,包含两个接口:加法和减法。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class CalcRequest(BaseModel):
    first: int
    second: int

class CalcResult(BaseModel):
    result: int

# 加法接口
@app.post("/add", response_model=CalcResult)
async def add(req: CalcRequest):
    return CalcResult(result=req.first + req.second)

# 减法接口
@app.post("/sub", response_model=CalcResult)
async def subtract(req: CalcRequest):
    return CalcResult(result=req.first - req.second)

CalcRequest类是输入数据的数据类型,它定义了两个整数数据firstsecondCalcResult是输出数据的数据类型,它只包含一个字段result,表示计算结果。

两个路由都使用了@app.post()装饰器,DataFrame中定义的数据模型作为第一个参数进行传递。输出模型从CalcResult中指定,以确保输出结果合规。

使用命令uvicorn main:app --reload运行程序,访问 http://127.0.0.1:8000/add 和 http://127.0.0.1:8000/sub 即可看到运行结果。

以上就是关于使用FastAPI快速构建Web项目的实现过程。FastAPI提供了便捷快速的开发API的方式,支持自动文档和JSON schema生成等,可以极大提高开发效率,推荐大家使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:FastApi如何快速构建一个web项目的实现 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Django中信号signals的简单使用方法

    下面是Django中信号signals的简单使用方法: 什么是信号signals? 信号signals是Django提供的一种机制,通过该机制,某些操作的完成可以触发指定的处理函数,我们可以在这些处理函数中实现一些自己想要的操作。比如:在用户注册成功后,我们想给他发送一封欢迎电子邮件,那么我们就可以使用信号来实现这个功能。 Django中的信号signals…

    Flask 2023年5月16日
    00
  • flask开启多线程的具体方法

    下面是关于”flask开启多线程的具体方法”的完整攻略及两条示例说明。 什么是多线程? 在计算机科学中,多线程是指在同一进程内,有多条不同的执行路径。也就是说,一个应用程序可以同时开启多个线程执行多个任务,提高了应用程序的响应速度,提升了用户体验。 Flask如何开启多线程 Flask提供了使用多线程的方法,我们可以使用Python内置的threading模…

    Flask 2023年5月15日
    00
  • 基于Python的OCR实现示例

    以下是“基于Python的OCR实现示例”的完整攻略。 简介 OCR全称Optical Character Recognition,即光学字符识别。它是一种把图片中的文字转换成可编辑的文本的技术。在实际的应用中,OCR技术应用非常广泛,例如银行卡号、身份证号等信息的识别及录入、图书馆的数字化、网络图片中的文字识别等等。本攻略将介绍基于Python的OCR实现…

    Flask 2023年5月16日
    00
  • 在Python的Flask框架中构建Web表单的教程

    在Python的Flask框架中构建Web表单可以通过Flask-WTF扩展实现。在这个教程中,我们将会通过两个示例说明如何构建Web表单,包括表单元素,表单验证和数据提交。 环境准备 在开始之前,请确保你已经在系统中安装了Python和Flask,以及Flask-WTF扩展。 你可以通过以下命令安装Flask和Flask-WTF: pip install …

    Flask 2023年5月15日
    00
  • python flask几分钟实现web服务的例子

    下面是关于“python flask几分钟实现web服务的例子”的完整攻略,包含两个示例: 示例 1:Hello World 1. 安装 Flask 在命令行中输入以下命令安装Flask: pip install flask 2. 创建 Python 文件 在任何目录中创建一个名为app.py的 Python 文件,然后复制以下代码: from flask …

    Flask 2023年5月15日
    00
  • Vue打包路径配置过程

    下面是 Vue 打包路径配置的完整攻略: 1. 理解打包路径 在 Vue 应用中,所有的资源文件都可以被打包(Bundle)到一起,如 JS、CSS、图片等等。在浏览器端使用时,需要访问打包后的文件,这些文件在浏览器中被认为是相对于 HTML 引用的路径来解析的。因此,我们需要对打包路径进行配置。打包路径分为两种情况: 在开发环境下使用的路径 在生产环境下使…

    Flask 2023年5月16日
    00
  • Python如何使用logging为Flask增加logid

    为Flask应用增加LogID可以提高应用日志的可追踪性,有助于在多个系统之间快速查找和定位问题。而使用Python自带的logging模块来实现Flask应用的日志输出是个不错的选择。下面是一个使用logging模块为Flask增加LogID的攻略,包含了两条完整的示例。 步骤一:安装logging模块 logging是Python自带的标准库,无需额外安…

    Flask 2023年5月16日
    00
  • Flask之pipenv虚拟环境的实现

    下面是“Flask之pipenv虚拟环境的实现”的完整攻略。 1. 前置准备 在开始之前需要确保系统中已经安装了Python和pip。此外,还需要安装pipenv。 安装pipenv的命令为: pip install pipenv 2. 创建虚拟环境 为了避免依赖混乱和版本冲突,需要在项目根目录下创建虚拟环境。具体步骤如下: 打开终端并进入项目根目录: cd…

    Flask 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部