Flask or FastAPI? Python服务端初体验

这篇具有很好参考价值的文章主要介绍了Flask or FastAPI? Python服务端初体验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 引言

最近由于工作需要,又去了解了一下简单的python服务搭建的相关工作,主要是为了自己开发的模型或者工具给同组的人使用。之前介绍的针对于数据科学研究比较友好的一个可以展示的前端框架Streamlit可以说是一个利器。不过,随着ChatGPT的流行,基于chat的服务越来越多了起来,streamlit有一个chat衍生物streamlit-chat,但是它能提供的只是一个简单的聊天功能,并不能具有更高级显示,例如支持markdown和流式输出等。因此,更加适合大模型前端的FastChat可能是更好的选择。

话说回来,前端只是一个展示的界面,而真正提供服务的,需要后端才行。严格意义上讲,后端都是提供数据服务的,也就是对数据进行增删查改的,本质是离不开的,但是现在不是和数据库链接,而是和模型或者模型服务链接了。

这时候,当我去搜索python的后端库的时候,最长用的中小应用web框架Flask出现在我面前。但是我感觉还是有点复杂,于是我想到了一个基于Starlette二次开发的FastAPI,也许更适合。(这里有他们之间的比较介绍,介绍1,介绍2,介绍3,介绍4)。当然,也有人指出,用Flask与FastAPI比较式不公平的,就像是比较苹果和橙汁哪个更甜一样。Flask作为通用web框架,应该和Starlette比。我关于这点也是认同的。但这更能说明,在一个需要快速开发而需求不是那么重的时候,FastAPI是一个更好的选择。(当然我也用Flask开发过多线程支持的服务,两者各有千秋。)

2. Hello world

正如任何语言的第一个案例一样,我们首先用一个非常简单的例子介绍使用FastAPI提供服务的。

第一步,准备代码app.py

from fastapi import FastAPI
from pydantic import BaseModel
from gpt import GPT

app = FastAPI()
model = GPT()

class Message(BaseModel):
    new_message: str
    role: str = ""
    args: dict = {}

@app.post('/gpt')
def gpt_endpoint(message: Message):
    new_message = message.new_message
    role = message.role
    args = message.args

    response = model.call(new_message=new_message, role=role, args=args)
    return response

从这段不足50行的代码里,凸显出了大部分的FastAPI的特性。可以看到主体app,自己的资源model以及一个数据类Message,一个post接口服务(名为/gpt),并做了一些操作,返回response。

这里的GPT是简化的类,其处理代码可以写到另一个文件中。

第二步,安装依赖库

pip install fastapi
pip install uvicorn
pip install pydantic

第三步,运行服务

uvicorn app:app --host 0.0.0.0 --port 8000

经历以上三步,一个FastAPI服务就搭建好了,访问地址例如:http://localhost:8000/gpt,如何快速的测试它呢?FastAPI自带了Docs,可以通过URL访问(http://localhost:8000/docs),如下图所示:
fastapi和flask,python,python,flask,fastapi

如果代码中注释写的足够多的话,都不用另写手册了。

但是刚才的代码只是向我们简单的介绍了一下FastAPI的特性,如果我需要构建更加复杂的服务呢?下面我们通过2个实战例子更加全面的介绍FastAPI的使用。

3. 扩充实战

3.1 使用FastAPI提供增删查改的例子

假设我们正在开发一个简单的待办事项管理应用程序。我们希望实现以下功能:

  • 获取所有待办事项的列表
  • 创建一个新的待办事项
  • 更新特定待办事项的内容
  • 标记特定待办事项为已完成
  • 删除特定待办事项

我们可以使用FastAPI来实现这些功能。以下是使用不同类型装饰器定义的API端点的示例代码:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# 待办事项数据模型
class TodoItem(BaseModel):
    id: int
    title: str
    completed: bool = False

# 模拟的待办事项存储
todo_items = []

# 获取所有待办事项的列表
@app.get("/todos")
def get_todo_list():
    return todo_items

# 创建一个新的待办事项
@app.post("/todos")
def create_todo_item(item: TodoItem):
    todo_items.append(item)
    return item

# 更新特定待办事项的内容
@app.put("/todos/{item_id}")
def update_todo_item(item_id: int, item: TodoItem):
    for i in range(len(todo_items)):
        if todo_items[i].id == item_id:
            todo_items[i] = item
            return item

# 标记特定待办事项为已完成
@app.patch("/todos/{item_id}")
def complete_todo_item(item_id: int):
    for item in todo_items:
        if item.id == item_id:
            item.completed = True
            return item

# 删除特定待办事项
@app.delete("/todos/{item_id}")
def delete_todo_item(item_id: int):
    for item in todo_items:
        if item.id == item_id:
            todo_items.remove(item)
            return {"message": "Item deleted"}


在上面的示例中,我们使用了以下不同类型的装饰器:

  1. @app.get(path: str):定义GET请求的端点。使用@app.get(“/todos”)装饰器定义了获取所有待办事项的列表的端点。这个端点不需要接收任何参数,直接返回待办事项列表。

  2. @app.post(path: str):定义POST请求的端点。使用@app.post(“/todos”)装饰器定义了创建新待办事项的端点。这个端点接收一个请求体参数item,它是一个TodoItem模型的实例,包含了待办事项的内容。在处理函数中,我们将新的待办事项添加到todo_items列表中,并返回添加的待办事项。

  3. @app.put(path: str):定义PUT请求的端点。使用@app.put(“/todos/{item_id}”)装饰器定义了更新待办事项的端点。这个端点接收一个路径参数item_id用于指定待办事项的ID,以及一个请求体参数item,它是一个TodoItem模型的实例,包含了待办事项的新内容。在处理函数中,我们遍历todo_items列表找到对应ID的待办事项,将其更新为新的内容,并返回更新后的待办事项。

  4. @app.patch(path: str):定义PATCH请求的端点。使用@app.patch(“/todos/{item_id}”)装饰器定义了标记待办事项为已完成的端点。这个端点接收一个路径参数item_id用于指定待办事项的ID。在处理函数中,我们遍历todo_items列表找到对应ID的待办事项,并将其标记为已完成(item.completed = True),然后返回已更新的待办事项。

  5. @app.delete(path: str):定义DELETE请求的端点。使用@app.delete(“/todos/{item_id}”)装饰器定义了删除待办事项的端点。这个端点接收一个路径参数item_id用于指定待办事项的ID。在处理函数中,我们遍历todo_items列表找到对应ID的待办事项,并将其从列表中删除,然后返回一个简单的消息表示删除成功。

  6. 这些装饰器允许我们根据HTTP方法(GET、POST、PUT、PATCH、DELETE)来定义不同类型的端点,并通过路径参数和请求体参数来接收和处理不同的数据。这样,我们可以使用统一的应用程序来处理各种操作,并根据RESTful API的原则设计我们的API。

这里,我们注意到PUT和PATCH方法是很相似的,都是用于更新的,但是两者有以下不同:

PUT请求用于完全替换(Replace)服务器上的资源或实体。当客户端发送一个PUT请求时,它需要提供完整的资源表示,包括要更新的所有字段。
如果资源不存在,则会创建一个新的资源;如果资源存在,则会完全替换(覆盖)现有资源的内容。
客户端通常应该提供完整的资源表示,即使只有部分字段发生更改。这意味着客户端需要提供所有字段,而不仅仅是要更改的字段。
PUT请求是幂等的,多次执行相同的PUT请求不会对资源产生额外的影响。

PATCH请求用于对服务器上的资源或实体进行部分更新。当客户端发送一个PATCH请求时,它只需要提供要更新的部分字段或属性。
PATCH请求可以用于增量更新资源的特定字段,而不需要发送整个资源的表示。这使得它适用于只更新部分字段的情况。
服务器根据客户端提供的更新内容,选择性地更新资源的相应字段。未提供的字段将保持不变。
PATCH请求可以是幂等的,但也可以是非幂等的,这取决于具体实现和使用情况。

在实际应用中,可以根据具体的业务需求和设计准则来选择使用PUT还是PATCH请求。如果要更新整个资源或实体,应该使用PUT请求。如果只需更新部分字段或属性,应该使用PATCH请求。

3.2 使用FastAPI提供GPU加载语言模型的例子

import uvicorn
import torch
from fastapi import FastAPI, BackgroundTasks
from pydantic import BaseModel

# 示例GPT模型类
class GPTModel:
    def __init__(self):
        # 这里是你的GPT模型的初始化代码
        # ...

    def generate_text(self, input_text):
        # 这里是生成文本的代码
        # ...

# 示例后台任务函数
def load_model(background_tasks):
    # 加载和初始化GPT模型
    model = GPTModel()
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)
    model.eval()

    # 将模型保存到FastAPI应用的state中
    app.state.model = model

# 示例请求模型的输入
class TextRequest(BaseModel):
    text: str

app = FastAPI()

@app.post("/generate")
def generate_text(request: TextRequest, background_tasks: BackgroundTasks):
    # 在后台任务中加载模型
    background_tasks.add_task(load_model, background_tasks)

    # 从应用程序状态中获取模型
    model = app.state.model

    # 在GPU上进行推理
    input_text = request.text
    generated_text = model.generate_text(input_text)

    # 返回生成的文本结果
    return {"generated_text": generated_text}

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

4. 小结

本文主要简单的介绍了FastAPI的一些简单用法,方便快速搭建原型服务。

(随着ChatGPT等大模型逐渐渗透到我们的生活中,可能如此记录技术细节的博客愈发的没有用了。因为不会的东西ChatGPT可以交互式的给予指导,而不需要再这样看博客了。尽管这博客也离不开ChatGPT的指示,我还是看了一些相关博客,也自己亲手试了ChatGPT给的代码,多少增加一些可信度。)文章来源地址https://www.toymoban.com/news/detail-712603.html

到了这里,关于Flask or FastAPI? Python服务端初体验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FastAPI 快速学习之 Flask 框架对比

           本文主要对 FastAPI 与 Flask 框架进行对比,以助快速学习。进一步了解FastAPI的高级使用方法,可参考 FastAPI官方文档 。如果对你有帮助,欢迎三连 收藏 点赞 关注 !!!          Flask作为Python语言中的老牌Web框架,已经被应用于大量的Python Web开发项目,其使用

    2024年01月17日
    浏览(43)
  • FastAPI和Flask:构建RESTful API的比较分析

    Python 是一种功能强大的编程语言,广泛应用于 Web 开发领域。 FastAPI  和 Flask 是 Python Web 开发中最受欢迎的两个框架。本文将对 FastAPI 和 Flask 进行综合对比,探讨它们在语法和表达能力、生态系统和社区支持、性能和扩展性、开发工具和调试支持、安全性和稳定性、学习曲线

    2024年02月13日
    浏览(47)
  • 从性能、开发难度、推广使用等方面,对比一下django flask fastapi的优点和缺点

    当选择一个适合你的项目的Python Web框架时,你可能会考虑以下几个方面:性能、开发难度和推广程度。在这里,我们将比较Django、Flask和FastAPI这三个常用的框架,深入探讨它们的优点和缺点。 1. 性能:    - Django:Django是一个全功能的框架,它提供了许多内置的功能和扩展。

    2024年02月12日
    浏览(42)
  • Java服务器调用Python服务器进行交互:基于Http协议的Restful风格调用(Springboot/FastApi)

    实现Java服务器调用Python服务器进行交互以及数据传输,可采用以下方法,亲测有效: 基于Restful风格进行请求调用: 框架 : Java服务器采用Springboot框架进行搭建服务 python服务器采用FastApi框架进行搭建服务 思路 :前端–Java–python–Java–前端 代码设计 :Axios-@PostMapping-请求

    2024年04月26日
    浏览(44)
  • python系列28:fastapi部署应用

    FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,类似flask,Django,webpy 在部署时可能需要用到下面的库: Uvicorn 或者 Hypercorn负责ASGI 服务器。 Starlette 负责 web 部分。 Pydantic 负责数据部分。 都用pip install安装即可 示例代码如下: 如果你的代码里会出现 async /

    2024年01月18日
    浏览(40)
  • python高并发优选之FastAPI

    FastAPI是一个基于Python 3.6+的现代Web框架,它专注于高性能和易用性。FastAPI通过结合多种技术实现了出色的性能,包括异步编程、类型提示和自动文档生成。FastAPI基于Starlette框架,并且使用Pydantic库进行数据验证和转换,从而使RESTful API的开发变得更加容易。 在FastAPI中,GET和

    2024年02月11日
    浏览(43)
  • Python - 【FastAPI】框架配置搭建基本使用

    之前在面试的时候面试官有提到过这个框架,但是个人在之前的项目中没有用到过,只是有听过,并没有实际的应用,因此,个人自己研究了一下,这是个新型的框架,使用起来相对挺简单。FastAPI是一个基于Python的现代Web框架,它具有快速构建高性能API的特点。 中文文档:

    2024年02月11日
    浏览(37)
  • 230902-部署Gradio到已有FastAPI及服务器中

    1. 官方例子 run.py 运行方式: uvicorn run:app 2. 油管例子 gradio_ui.py run.py 运行方式 注意事项 3. 视频演示 230920-部署Gradio到已有FastAPI及服务器中 4. 参考文献 mounting-within-another-fast-api-app RajKKapadia/YouTube-Gradio-Deploy-Demo How to deploy Gradio application on Server | Render | Gradio | Python - YouTube

    2024年02月10日
    浏览(46)
  • Python - FastAPI 实现 get、post 请求

    目录 一.引言 二.FastAPI Server 构建 1.get - read_items 2.post - create_item 3.uvicorn - run_app 三.Postman 请求 1.post - create_item 2.get - read_items 四.Requests 请求 1.post - create_item 2.get - read_items 五.总结 前面介绍了 LLM 的相关知识,从样本加载、模型加载到后面的模型训练与模型推理,我们经历的完

    2024年02月05日
    浏览(41)
  • 【Python开发】FastAPI 07:Depends 依赖注入

    在 FastAPI 中, Depends 是一个依赖注入系统,用于注入应用程序中所需的依赖项,通过 Depends ,我们可以轻松地将依赖项注入到 FastAPI 路由函数中。简单来说,Depends 依赖注入的目的就是将代码重复最小! 目录 1 Depends 使用 1.1 依赖注入介绍 1.2 demo 1.3 OpenAPI 集成 2 不同依赖项

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包