Python怎么实现Web服务器FastAPI

1、简介

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python类型提示。

关键特性:

  • 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Starlette 和 Pydantic)。非常快的 Python web 框架之一。

  • 高效编码:提高功能开发速度约 200% 至 300%。*

  • 更少 bug:减少约 40% 的人为(开发者)导致错误。*

  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。

  • 简单:设计的易于使用和学习,阅读文档的时间更短。

  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。

  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。

  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

2、安装

pip install fastapiorpip install fastapi[all]

Python怎么实现Web服务器FastAPI

运行服务器的命令如下:

uvicorn main:app --reload

3、官方示例

使用 FastAPI 需要 Python 版本大于等于 3.6。

3.1 入门示例 Python测试代码如下(main.py):

# -*- coding:utf-8 -*-from fastapi import FastAPIapp = FastAPI()@app.get("/")async def root():    return {"message": "Hello World"}

运行结果如下:
运行服务器的命令如下:

uvicorn main:app --reload

Python怎么实现Web服务器FastAPI

Python怎么实现Web服务器FastAPI

Python怎么实现Web服务器FastAPI

3.2 跨域CORS

CORS 或者「跨域资源共享」 指浏览器中运行的前端拥有与后端通信的 JavaScript 代码,而后端处于与前端不同的「源」的情况。

源是协议(http,https)、域(myapp.com,localhost,localhost.tiangolo.com)以及端口(80、443、8080)的组合。因此,这些都是不同的源:

http://localhosthttps://localhosthttp://localhost:8080

Python测试代码如下(test_fastapi.py):

# -*- coding:utf-8 -*-from typing import Unionfrom fastapi import FastAPI, Requestimport uvicornfrom fastapi.middleware.cors import CORSMiddlewareapp = FastAPI()# 让app可以跨域# origins = ["*"]origins = [    "http://localhost.tiangolo.com",    "https://localhost.tiangolo.com",    "http://localhost",    "http://localhost:8080",]app.add_middleware(    CORSMiddleware,    allow_origins=origins,    allow_credentials=True,    allow_methods=["*"],    allow_headers=["*"],)# @app.get("/") # async def root(): #     return {"Hello": "World"}@app.get("/")def read_root():    return {"message": "Hello World,爱看书的小沐"}@app.get("/items/{item_id}")def read_item(item_id: int, q: Union[str, None] = None):    return {"item_id": item_id, "q": q}@app.get("/api/sum") def get_sum(req: Request):     a, b = req.query_params['a'], req.query_params['b']     return int(a) + int(b) @app.post("/api/sum2") async def get_sum(req: Request):     content = await req.json()     a, b = content['a'], content['b']     return a + b@app.get("/api/sum3")def get_sum2(a: int, b: int):     return int(a) + int(b)if __name__ == "__main__":    uvicorn.run("test_fastapi:app", host="127.0.0.1", port=8000                , log_level="info", reload=True, debug=True)

运行结果如下:

Python怎么实现Web服务器FastAPI

Python怎么实现Web服务器FastAPI

Python怎么实现Web服务器FastAPI

FastAPI 会自动提供一个类似于 Swagger 的交互式文档,我们输入 “localhost:8000/docs” 即可进入。

Python怎么实现Web服务器FastAPI

3.3 文件操作

返回 json 数据可以是:JSONResponse、UJSONResponse、ORJSONResponse,Content-Type 是 application/json;返回 html 是 HTMLResponse,Content-Type 是 text/html;返回 PlainTextResponse,Content-Type 是 text/plain。
还有三种响应,分别是返回重定向、字节流、文件。

(1)Python测试重定向代码如下:

# -*- coding:utf-8 -*-from fastapi import FastAPI, Requestfrom fastapi.responses import RedirectResponseimport uvicornapp = FastAPI()@app.get("/index")async def index():    return RedirectResponse("https://www.baidu.com")@app.get("/")def main():    return {"message": "Hello World,爱看书的小沐"}if __name__ == "__main__":    uvicorn.run("test_fastapi:app", host="127.0.0.1", port=8000                , log_level="info", reload=True, debug=True)

运行结果如下:

Python怎么实现Web服务器FastAPI

(2)Python测试字节流代码如下:

# -*- coding:utf-8 -*-from fastapi import FastAPI, Requestfrom fastapi.responses import StreamingResponseimport uvicornapp = FastAPI()async def test_bytearray():    for i in range(5):        yield f"byteArray: {i} bytes ".encode("utf-8")@app.get("/index")async def index():    return StreamingResponse(test_bytearray())@app.get("/")def main():    return {"message": "Hello World,爱看书的小沐"}if __name__ == "__main__":    uvicorn.run("test_fastapi:app", host="127.0.0.1", port=8000                , log_level="info", reload=True, debug=True)

运行结果如下:

Python怎么实现Web服务器FastAPI

(3)Python测试文本文件代码如下:

# -*- coding:utf-8 -*-from fastapi import FastAPI, Requestfrom fastapi.responses import StreamingResponseimport uvicornapp = FastAPI()@app.get("/index")async def index():    return StreamingResponse(open("test_tornado.py", encoding="utf-8"))@app.get("/")def main():    return {"message": "Hello World,爱看书的小沐"}if __name__ == "__main__":    uvicorn.run("test_fastapi:app", host="127.0.0.1", port=8000                , log_level="info", reload=True, debug=True)

运行结果如下:

Python怎么实现Web服务器FastAPI

(4)Python测试二进制文件代码如下:

# -*- coding:utf-8 -*-from fastapi import FastAPI, Requestfrom fastapi.responses import FileResponse, StreamingResponseimport uvicornapp = FastAPI()@app.get("/download_file")async def index():    return FileResponse("test_fastapi.py", filename="save.py")@app.get("/get_file/")async def download_files():    return FileResponse("test_fastapi.py")@app.get("/get_image/")async def download_files_stream():    f = open("static\images\sheep0.jpg", mode="rb")    return StreamingResponse(f, media_type="image/jpg")@app.get("/")def main():    return {"message": "Hello World,爱看书的小沐"}if __name__ == "__main__":    uvicorn.run("test_fastapi:app", host="127.0.0.1", port=8000                , log_level="info", reload=True, debug=True)

运行结果如下:

Python怎么实现Web服务器FastAPI

Python怎么实现Web服务器FastAPI

Python怎么实现Web服务器FastAPI

3.4 WebSocket Python测试代码如下:

# -*- coding:utf-8 -*-from fastapi import FastAPI, Requestfrom fastapi.websockets import WebSocketimport uvicornapp = FastAPI()@app.websocket("/myws")async def ws(websocket: WebSocket):    await websocket.accept()    while True:        # data = await websocket.receive_bytes()        # data = await websocket.receive_json()        data = await websocket.receive_text()        print("received: ", data)        await websocket.send_text(f"received: {data}")@app.get("/")def main():    return {"message": "Hello World,爱看书的小沐"}if __name__ == "__main__":    uvicorn.run("test_fastapi:app", host="127.0.0.1", port=8000                , log_level="info", reload=True, debug=True)

HTML客户端测试代码如下:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Tornado Websocket Test</title></head><body><body onload='onLoad();'>Message to send: <input type="text" id="msg"/><input type="button" onclick="sendMsg();" value="发送"/></body></body><script type="text/javascript">    var ws;    function onLoad() {        ws = new WebSocket("ws://127.0.0.1:8000/myws");		ws.onopen = function() {           console.log('connect ok.')		   ws.send("Hello, world");		};		ws.onmessage = function (evt) {		   console.log(evt.data)		};        ws.onclose = function () {             console.log("onclose")         }    }    function sendMsg() {        ws.send(document.getElementById('msg').value);    }</script></html>

运行结果如下:

Python怎么实现Web服务器FastAPI

Python怎么实现Web服务器FastAPI

以上就是关于“Python怎么实现Web服务器FastAPI”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

文章标题:Python怎么实现Web服务器FastAPI,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/29208

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月24日 上午12:12
下一篇 2022年9月24日 上午12:14

相关推荐

  • node服务CPU过高如何解决

    帮同事看一个CPU过高的问题 CPU涨了后掉不下去,最终同事排查出来是 某个依赖升级大版本后下线了默认的公共 redis 配置,(项目较老,很久没人动过)但需要业务方代码里自己配置关闭 redis服务。业务方有信息gap,所以不知道要关闭redis,导致上线后,一直在重试连接redis(多一个请求就…

    2022年9月16日
    2.0K00
  • Android开发怎么自定义实时图表控件

    今天分享文章“Android开发怎么自定义实时图表控件”,主要从:演示、环境、实现、第十一步:绘制等几个方面为大家介绍,希望能帮到您。 演示 环境 开发工具:Android Studio 开发语言:Kotlin 实现 名列前茅步:新建项目RealTimeChartDemo 第二步:新建RealTim…

    2022年6月29日
    54000
  • vue组件值变化但不刷新问题怎么解决

    今天分享文章“vue组件值变化但不刷新问题怎么解决”,主要从:组件值变化但不刷新强制组件刷新、bug复现、解决等几个方面为大家介绍,希望能帮到您。 组件值变化但不刷新强制组件刷新 在调用组件的时候,如果数据中只是某个属性变化(比如id)变化,在vue开发工具中看到变量值变化,但是组件上的数据就是不刷…

    2022年6月29日
    2.1K00
  • mybatisplus雪花算法生成Id怎么使用

    雪花算法实战 1.建表 DROP TABLE IF EXISTS user;CREATE TABLE user( id BIGINT(20) NOT NULL COMMENT ‘主键ID’, name VARCHAR(30) NULL DEFAULT NULL COMMENT ‘姓名’, age I…

    2022年9月21日
    1.1K00
  • thumb文件夹可以删除吗

    thumb指的是系统隐藏缓存文件,可以删除;thumb文件是系统为例提高文件夹在缩略图查看方式下的响应速度而对当前文件夹下的图像文件建立的缓存,可以方便用户对图片进行预览,删除或者禁用都不会对系统造成影响。 本教程操作环境:windows10系统、DELL G3电脑。 thumb是什么文件夹?可以删…

    2022年9月18日
    1.9K00
  • Python遗传算法Geatpy工具箱怎么用

    一、 什么是遗传算法? 遗传算法是仿真生物遗传学和自然选择机理,通过人工方式所构造的一类搜索算法,从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真。生物种群的生存过程普遍遵循达尔文进化准则,群体中的个体根据对环境的适应能力而被大自然所选择或淘汰。进化过程的结果反映在个体的结构上,其染色体包含…

    2022年9月10日
    99300
  • Redis三种集群模式是什么

    三种集群模式 redis有三种集群模式,其中主从是最常见的模式。 Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的。哨兵顾名思义,就是用来监控的,主要作用就是监控主从集群,自动切换主备,完成集群故障转移。 cluster 模式是redis官方提供的集群模式,…

    2022年9月1日
    70300
  • git如何解决合并冲突

    本篇文章“git如何解决合并冲突”主要为您从以下几个方面讲解:原因、解决方法、git冲突、解决冲突,希望对您有所启发。 git解决合并冲突的方法:1、编辑有冲突的文件,并删除文件中的特殊符号,根据需求修改代码;2、将指定文件添加到暂存区,并将指定的分支提交到主干,执行提交即可,其中使用“git co…

    2022年6月29日
    1.4K00
  • 怎么用javascript实现自定义事件功能

    概述 自定义事件很难派上用场? 为什么自定义事件很难派上用场,因为以前js不是模块化开发,也很少协作。因为事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。而现在有了模块化之后,已经可以使用自定义事件进行各模块间协作了。 哪里用得到自定义事件? 事…

    2022年8月27日
    51700
  • cad字体都是问号如何解决

    解决方法 1、比如我们打开图纸时,系统提示找不到字体gbcbig.shx; 2、然后我们复制这个字体去浏览器里搜索下载。 3、接着我们点击桌面上的CAD图标,点击属性,打开快捷方式,找到底部的打开文件所在位置。 4、然后我们找到字体文件夹,就是Fonts文件夹。 5、接着我们就把刚刚从网站上下载下来…

    2022年9月6日
    56300
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部