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

相关推荐

  • cad字体乱码如何解决

    cad字体乱码解决方法 1、首先鼠标右键CAD的图标,点击“打开文件位置”; 打开CAD的默认安装位置。 2、找到名为Fonts的文件夹。 3、找到simsun.ttc这个文件,点击删除。再重启CAD就可以了。 关于“cad字体乱码如何解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“c…

    2022年9月15日
    37100
  • 对混淆变形的Webshell分析是怎样的

    WebShell是什么? 在最初的时候,Webshell经常被用来作为Web服务器管理员对服务器进行远程管理的一类脚本的简称。后来,随着一些Webshell管理工具的诞生,使得获取Web权限的过程被很大程度地简易化,于是逐渐被称为Web入侵的工具脚本。 Webshell不同于漏洞,而是利用应用漏洞或…

    2022年9月22日
    21800
  • 加密在网络上有哪些作用

    加密在网络上的作用就是防止有用或私有化信息在网络上被拦截和窃取。加密后的口令即使被黑客获得也是不可读的,加密后的标书没有收件人的私钥也就无法解开,标书成为一大堆无任何实际意义的乱码,这样即使被盗也不会有损失;所以加密对于保护文件是相当的重要。 本教程操作环境:windows7系统、Dell G3电脑…

    2022年9月13日
    21700
  • C语言中sizeof与整型数据存储及数据类型取值范围

    1.关键字sizeof sizeof 与 strlen 是我们日常打代码时经常使用到的两个“工具”。前者是求变量或者类型的大小(单位为字节),后者是求某一字符串的长度。我们很容易产生这样一个误解,即把 sizeof 和 strlen 归为函数一类。事实上 sizeof 并不是一个函数,它是一个操作符…

    2022年9月20日
    27600
  • java源文件的扩展名是哪个

    java源文件扩展名是“.java”;用javac进行编译,生成后缀名为“.class”的字节码文件,保存在和源程序一致的目录下,如源代码有错误,会按行指出错误,修改错误后重新进行编译,直至生成“.class”字节码文件为止。 本教程操作环境:windows7系统、java10版、DELL G3电脑…

    2022年8月27日
    40300
  • 如何进行基于威胁情报周期模型的APT木马剖析

    关于威胁情报处理周期模型 “威胁情报处理周期”(F3EAD)一词源于军事,是美陆军为主战兵种各级指挥员设计的组织资源、部署兵力的方法。网络应急响应中心借鉴这套方法,分以下六个阶段处理威胁情报信息: 威胁情报处理周期F3EAD 威胁情报处理周期模型的应用 名列前茅步:查找 某月某日,部署在合作方公有云…

    2022年9月8日
    20700
  • mysql如何查询名列前茅条数据

    在mysql中,可以使用SELECT语句配合LIMIT子句来查询名列前茅条数据,语法为“SELECT *|字段名列表 FROM 表名 LIMIT 0,1;”。LIMIT子句可以指定查询结果从哪条记录开始显示,显示多少条记录,语法“LIMIT 初始位置,记录数”,而名列前茅条记录的位置是0;因此想要显…

    2022年9月24日
    70200
  • windows microsoft edge能不能卸载

    “microsoft edge”不能卸载是没有影响的;“microsoft edge”是微软与windows10同步推出的一款浏览器,其中支持内置Cortana语音功能,该浏览器是系统中自带的应用程序,无法通过程序选项完成卸载。 本教程操作环境:windows10系统、DELL G3电脑。 micr…

    2022年9月15日
    86700
  • SolarWinds供应链APT攻击事件安全风险的示例分析

    背景 12月13日,美国拔尖安全公司FireEye(中文名:火眼)发布报告称,其发现一起全球性入侵活动,命名该组织为UNC2452。该APT组织通过入侵SolarWinds公司,在SolarWinds Orion商业软件更新包中植入恶意代码,进行分发,FireEye称之为SUNBURST恶意软件。该…

    2022年9月8日
    27100
  • 如何进行XXL-JOB API接口未授权访问RCE漏洞复现

    XXL-JOB描述 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 一、 漏洞详情 此次漏洞核心问题是 GLUE 模式。XXL-JOB 通过“GLUE模式”支持多语言以及脚本任务,该模式任务特点如下…

    2022年9月8日
    1.9K00
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部