如何使用Python创建API - Ander Fernández Jauregui
作为数据科学家或数据工程师,我们经常需要分享自己的工作成果,以便公司中的其他人能够使用我们创建的流程或模型。显然,直接共享脚本并不是一个理想的选择,因为这要求其他人拥有与我们完全相同的环境和依赖项。在这种情况下,Python创建API。
API基础知识
API(应用程序编程接口)是一种允许两个计算机系统相互通信的工具。例如,如果我们开发了一个自动生成报告并通过电子邮件发送的系统,邮件的发送将由脚本完成,而不是手动操作。为此,Python需要通过Gmail API向Gmail发送请求,并附加报告文件。
了解了API的基本概念后,我们来看一下API的主要组成部分:
HTTP传输协议
HTTP是网络上信息交换的主要方式,常见的HTTP方法包括:
- GET:用于从数据库或进程中获取信息。
- POST:用于发送信息,例如向数据库添加数据或传递机器学习模型的输入。
- PUT:用于更新信息,通常用于修改数据库中的记录。
- DELETE:用于从数据库中删除信息。
URL
URL是访问API的地址,通常由以下三部分组成:
- 协议:例如
http://或https://。 - 域名:API托管的主机地址,例如
example.com。 - 端点:API的具体路径,例如
/api/v1/resource。每个端点对应API的一个功能。
了解了API的基础知识后,我们将学习如何在Python中创建API。
如何在Python中创建API
在FastAPI和Flask。接下来,我们将分别介绍如何使用这两种框架创建API。
如何使用FastAPI在Python中创建API
使用FastAPI的要求
FastAPI是一个现代化的Python框架,专为构建高性能API而设计。它于2018年底推出,仅支持Python 3.6及以上版本。
要使用FastAPI,需要安装以下两个库:
pip install fastapi uvicorn
创建第一个FastAPI API
安装完必要的库后,我们可以创建一个Python文件来定义API。以下是一个简单的示例:
from fastapi import FastAPI
app = FastAPI()@app.get("/my-first-api")
def hello():
return {"message": "Hello, World!"}
在上面的代码中,我们定义了一个GET方法的端点/my-first-api,当访问该端点时,API将返回{"message": "Hello, World!"}。
添加参数支持
FastAPI允许我们为API添加参数,并指定参数的数据类型。例如:
from fastapi import FastAPI
app = FastAPI()@app.get("/my-first-api")
def hello(name: str):
return {"message": f"Hello, {name}!"}
在这个例子中,API需要一个名为name的字符串参数。如果我们访问http://127.0.0.1:8000/my-first-api?name=Ander,API将返回{"message": "Hello, Ander!"}。
返回不同的数据类型
FastAPI支持返回多种数据类型,例如DataFrame或图像。以下是一个返回DataFrame的示例:
from fastapi import FastAPI
import pandas as pd
app = FastAPI()@app.get("/get-iris")
def get_iris():
url = "https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/iris.csv"
iris = pd.read_csv(url)
return iris.to_dict()
如果需要返回图像,可以使用StreamingResponse:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import matplotlib.pyplot as plt
import pandas as pd
import io
app = FastAPI()@app.get("/plot-iris")
def plot_iris():
url = "https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/iris.csv"
iris = pd.read_csv(url)
plt.scatter(iris['sepal_length'], iris['sepal_width'])
plt.savefig("iris.png")
file = open("iris.png", mode="rb")
return StreamingResponse(file, media_type="image/png")
运行和测试FastAPI
将以上代码保存为main.py,然后运行以下命令启动API:
uvicorn main:app --reload
API将运行在http://127.0.0.1:8000,您可以通过浏览器或代码测试API。例如:
import requests
response = requests.get("http://127.0.0.1:8000/my-first-api?name=Ander")
print(response.json())
FastAPI还内置了Swagger文档,您可以通过http://127.0.0.1:8000/docs访问。
如何使用Flask在Python中创建API
使用Flask的要求
Flask是一个轻量级的Python框架,适合构建简单的Web应用程序和API。要使用Flask,需要安装以下库:
pip install flask flask-restful
创建第一个Flask API
以下是一个简单的Flask API示例:
from flask import Flask, jsonify
app = Flask(__name__)@app.route("/my-first-api", methods=["GET"])
def hello():
return jsonify({"message": "Hello, World!"})if __name__ == "__main__":
app.run(debug=True, port=8000)
运行上述代码后,API将运行在http://127.0.0.1:8000。
添加参数支持
在Flask中,可以通过request.args.get获取请求参数。例如:
from flask import Flask, request, jsonify
app = Flask(__name__)@app.route("/my-first-api", methods=["GET"])
def hello():
name = request.args.get("name")
if name:
return jsonify({"message": f"Hello, {name}!"})
return jsonify({"message": "Hello, World!"})
返回不同的数据类型
Flask也支持返回JSON数据或图像。例如,返回DataFrame:
from flask import Flask, jsonify
import pandas as pd
app = Flask(__name__)@app.route("/get-iris", methods=["GET"])
def get_iris():
url = "https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/iris.csv"
iris = pd.read_csv(url)
return jsonify(iris.to_dict())
返回图像的示例:
from flask import Flask, send_file
import matplotlib.pyplot as plt
import pandas as pd
app = Flask(__name__)@app.route("/plot-iris", methods=["GET"])
def plot_iris():
url = "https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/iris.csv"
iris = pd.read_csv(url)
plt.scatter(iris['sepal_length'], iris['sepal_width'])
plt.savefig("iris.png")
return send_file("iris.png", mimetype="image/png")
结论
FastAPI和Flask都是非常优秀的Python框架,各有优劣:
- FastAPI:适合快速数据验证和文档生成功能。
- Flask:适合构建完整的Web应用程序,灵活性更高。
如果您的目标是快速创建API,推荐使用FastAPI;如果需要构建一个包含前后端的完整应用程序,Flask可能是更好的选择。
无论选择哪种框架,掌握API开发都是数据科学家和工程师的重要技能。
原文链接: https://anderfernandez.com/en/blog/how-to-create-api-python/