将外部API集成到Flask应用程序中
如今,API是应用程序的一个主要部分。很多时候,我们需要使用第三方的API来进行认证、文件上传或获取其他信息。
API使我们能够使用其他应用程序提供的功能,而不必自己构建逻辑。这也使我们能够建立与许多其他服务集成的应用程序,因为接口已经提供。
前提条件
在继续进行之前,你需要有一个TMDB(The Movie DB)的API密钥。要获得一个,你必须在themoviedb.org上有一个账户。然后获得一个API密钥。
第1步 - 设置工作环境
创建以下文件夹结构。
├─────────────────┐
├── app.py
└── templates
└── movies.html
1 directory, 2 files
然后使用venv创建一个新的虚拟环境并安装Flask,使用下面的命令。
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install flask
注意:如果你使用的是Windows,你可能需要使用
venv\Scripts\activate而不是venv\bin\activate。提示 💡:Pipenv是一个使管理 Python 虚拟环境更容易的工具。它是venv和virtualenv的一个很好的替代品。
第2步 - 创建一个简单的视图
让我们通过创建一个简单的视图来配置Flask。
打开app.py ,添加以下代码。
from flask import Flask
app = Flask(__name__)
@app.route("/hello")
def hello_world():
return "<p>Hello, World!</p>"
if __name__ == '__main__':
app.run(debug=True)
我们已经导入了Flask ,并创建了一个简单的hello_world 视图,它返回一个简单的HTML页面。
打开你的终端,使用以下命令运行该应用程序。
python app.py
你可以到http://localhost:5000/hello,看看结果。
第3步 - 向TMDB API发送一个请求
现在,让我们向TMDB的API发送一个请求。
打开你的app.py ,添加以下代码。
from flask import Flask, render_template
import urllib.request, json
import os
@app.route("/")
def get_movies():
url = "https://api.themoviedb.org/3/discover/movie?api_key={}".format(os.environ.get("TMDB_API_KEY"))
response = urllib.request.urlopen(url)
data = response.read()
dict = json.loads(data)
return render_template ("movies.html", movies=dict["results"])
导入的 urllib.request是一个Python模块,将用于向TMDB API发送请求。importos 模块将用于获取TMDB的API密钥。
我们已经创建了一个新的路由/ ,返回TMDB API的响应。我们还添加了一个新的视图函数get_movies() ,当路由被调用时将被执行。
在get_movies() 函数中,我们。
- 使用TMDB的API密钥创建一个URL。
- 向TMDB API发送请求。
- 读取响应。
- 将响应转换为一个Python字典。
- 将字典返回给模板。
为了保证你的API密钥的安全,你不应该把它存储在你的代码中。相反,你应该把它存储在一个环境变量中。
在你的终端,运行下面的命令,将你的TMDB API密钥导出为环境变量。
export TMDB_API_KEY="<your_api_key>"
如果你使用的是Windows,你可能需要使用set TMDB_API_KEY=<your_api_key> ,而不是export 。
现在,打开你的templates/movies.html ,添加以下代码。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Movies</title>
</head>
<body>
<div>
{% block content %}
{% for movie in movies %}
<div id="movie" style="background-image: url(http://image.tmdb.org/t/p/w500{{movie.backdrop_path}});">
</div>
{% endfor %}
{% endblock %}
</div>
</body>
</html>
{% block content %} 标签是一个特殊的标签,将被用来渲染模板的内容。在这个块里面,我们使用一个for 循环遍历movies ,为每部电影渲染背景图片。
注意:
backdrop_path不是一个直接指向图像的URL。相反,它是图片的一个路径。我们将backdrop_path添加到image.tmdb.org/t/p/w500,以获得图像的直接URL。你可以在TMDB文档中了解更多关于图像的信息。
你可以在模板中显示更多的电影属性。例如,你可以显示标题、发行日期、评级等。
让我们添加一点CSS,使电影图像看起来更好。
<style>
#movie {
float: left;
width: 400px;
height: 250px;
margin: 10px;
border-radius: 7px;
box-shadow: 0px 0px 5px grey;
background-size: cover;
}
</style>
现在为应用程序服务,并导航到http://localhost:5000/。你应该看到电影海报了。
第4步--将请求-响应作为JSON发送到一个端点
假设我们想把每部电影的标题和概述属性以JSON格式发送到一个端点。
打开app.py ,创建一个新的端点,如下图所示。
@app.route("/movies")
def get_movies_list():
url = "https://api.themoviedb.org/3/discover/movie?api_key={}".format(os.environ.get("TMDB_API_KEY"))
response = urllib.request.urlopen(url)
movies = response.read()
dict = json.loads(movies)
movies = []
for movie in dict["results"]:
movie = {
"title": movie["title"],
"overview": movie["overview"],
}
movies.append(movie)
return {"results": movies}
在get_movies_list() 函数中,我们。
- 使用TMDB的API密钥创建一个URL。
- 向TMDB API发送请求。
- 读取响应。
- 将响应转换为一个Python字典。
- 从字典中提取
results属性。 - 遍历
results属性并为每部电影创建一个新的字典,包含标题和概述。 - 将JSON数据返回给模板。
为应用程序提供服务并导航到http://localhost:5000/movies。你应该看到电影的标题和概述。
总结
在本教程中,我们已经了解了如何向第三方API发送请求。在这个案例中,我们使用了TMDB API。我们还看到了如何以JSON格式向你的应用程序的端点发送请求-响应。