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

yizhihongxing

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日

相关文章

  • 如何部署Flask?(详解版)

    部署前准备 1.准备服务器环境(如 Ubuntu、CentOS等)。 2.安装必要的软件和库,包括 Python、pip、virtualenv、Nginx、Gunicorn等: # 安装 Python 和 pip sudo apt-get update sudo apt-get install python3-pip # 升级 pip pip install…

    Flask 2023年3月13日
    00
  • python 解决flask uwsgi 获取不到全局变量的问题

    一、问题描述 在Flask应用中,有时我们需要定义一些全局变量,比如数据库连接、缓存对象等等。而当使用uWSGI运行Flask应用时,有时会出现获取不到全局变量的情况。 这是因为uWSGI采用了多进程的方式运行应用,不同进程间的内存空间是独立的,因此在一个进程中定义的全局变量在另一个进程中是无法访问的。这种情况下,我们需要采用一些特殊的方式来解决该问题。 二…

    Flask 2023年5月16日
    00
  • python+flask编写一个简单的登录接口

    下面将为你详细讲解“Python+Flask编写一个简单的登录接口”的完整攻略以及两条示例说明。 一、准备工作 在开始编写登录接口前,需要进行以下准备工作: 1.安装Python和Flask,具体安装步骤可以参考官方文档。 2.安装Flask扩展flask_restful,可以使用以下命令进行安装: pip install flask_restful 二、编…

    Flask 2023年5月15日
    00
  • 用uWSGI和Nginx部署Flask项目的方法示例

    下面是“用uWSGI和Nginx部署Flask项目的方法示例”的完整攻略: 第一条示例:使用uWSGI和Nginx部署Flask项目 准备工作 在开始部署Flask项目前,你需要做以下准备工作: 在服务器上安装Nginx 在服务器上安装uWSGI 建立Flask项目 配置uWSGI 在Flask项目目录下创建一个uwsgi.ini文件,用于配置uWSGI。 …

    Flask 2023年5月15日
    00
  • Python的Flask框架使用Redis做数据缓存的配置方法

    下面我将详细讲解“Python的Flask框架使用Redis做数据缓存的配置方法”的完整攻略,过程中包含两条示例说明。 1. 安装Redis 首先需要安装Redis,可以在官网下载对应的安装包进行安装。安装完成后,需要启动Redis服务: redis-server 如果Redis成功启动,则会出现以下提示信息: Server started, Redis v…

    Flask 2023年5月16日
    00
  • python写的ARP攻击代码实例

    下面我就为你介绍一下“Python写的ARP攻击代码实例”的完整攻略以及两条示例说明。 什么是ARP攻击? ARP(Address Resolution Protocol,地址解析协议)是在局域网中用来将IP地址转换为MAC地址的协议。在ARP攻击中,攻击者可以伪造发送方的ARP请求或ARP响应,将正常通信的目标主机的IP地址指向另一个IP地址,从而绕过路由…

    Flask 2023年5月16日
    00
  • flask框架jinja2模板与模板继承实例分析

    下面是关于“flask框架jinja2模板与模板继承实例分析”的详细攻略。 1. 什么是jinja2模板? Jinja2是一个现代的、健壮的模板引擎,非常适用于Python Web应用程序。它使用简单,模板代码易于维护,并且可以灵活地支持大多数Web应用程序框架。 2. 什么是模板继承? 模板继承是Jinja2模板引擎的一个重要特性,可以帮助我们减少代码重复…

    Flask 2023年5月16日
    00
  • 微信小程序前端如何调用python后端的模型详解

    “微信小程序前端如何调用python后端的模型”需要通过Web API的方式进行调用。下面是详细的步骤: 步骤1:设计后端Web API 后端Web API实现了模型的调用,并输出模型结果。可以使用Flask或Django等框架来实现Web API。以下是一个用Flask编写的Web API的示例代码: from flask import Flask, re…

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