如何将外部API集成到Flask应用程序中

424 阅读4分钟

将外部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格式向你的应用程序的端点发送请求-响应。