如何使用Django显示来自DigitalOceanAPI的数据

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Mozilla 基金会 来接受捐赠。

介绍

随着对全栈开发的需求不断增长,Web 框架正在使开发工作流程变得更简单、更高效; Django 就是这些框架之一。 Django 已在 MozillaPinterestInstagram 等主要网站中使用。 与 Flask 不同,后者是一个中性的微框架,Django PyPI 包包含了全栈开发所需的一切; 无需为开发设置数据库或控制面板。

Django 的一个常见用例是使用它在您自己的网站和 Web 应用程序中显示来自 API(例如 Instagram 帖子或 GitHub 存储库)的信息。 虽然这在其他框架中是可能的,但 Django 的“包含电池”理念意味着创建相同结果所需的麻烦和包更少。

在本教程中,您将构建一个 Django 项目,该项目将使用 DigitalOcean v2 API 显示您的 DigitalOcean 帐户的 Droplet 信息。 具体来说,您将创建一个网站,该网站将显示一个 Droplet 表,其中列出了它们的每个 IP 地址、ID、托管区域和资源。 您的网站将使用 BulmaCSS 来设置页面样式,这样您就可以专注于开发,同时最终也有一些好看的东西。

完成本教程后,您将拥有一个 Django 项目,该项目可以生成如下所示的网页:

先决条件

在开始本指南之前,您需要以下内容:

  • 具有至少一个 Droplet 的 DigitalOcean 帐户和一个 个人访问令牌 。 确保将令牌记录在安全的地方; 您将在本教程的后面部分需要它。
  • 熟悉向 API 发出请求。 有关使用 API 的综合教程,请查看 如何在 Python3 中使用 Web API。
  • Python的本地虚拟环境,用于维护依赖。 在本教程中,我们将使用名称 do_django_api 作为我们的项目目录,并使用 env 作为我们的虚拟环境。
  • 熟悉 Django 的模板逻辑,用于使用 API 数据呈现页面。
  • 熟悉 Django 的视图 逻辑,用于处理从 API 接收的数据并将其提供给模板进行渲染。

第 1 步——制作一个基本的 Django 项目

在虚拟环境 env 中,安装 Django:

pip install Django

现在您可以启动一个 Django 项目并运行一些初始设置命令。

使用 django-admin startproject <name> 在以您的 Django 项目命名的项目文件夹中创建一个子目录,然后切换到该目录。

django-admin startproject do_django_project
cd do_django_project

创建后,在此子目录中,您将找到 manage.py,这是与 Django 交互和运行项目的常用方式。 使用 migrate 更新 Django 的开发数据库:

python3 manage.py migrate

随着数据库更新,您将看到如下所示的输出:

OutputOperations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

接下来,使用 runserver 命令运行项目,以便进行测试:

python3 manage.py runserver

当服务器启动时,输出将如下所示:

OutputWatching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
September 22, 2019 - 22:57:07
Django version 2.2.5, using settings 'do_django_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

您现在有一个基本的 Django 项目和一个正在运行的开发服务器。 要查看正在运行的开发服务器,请在浏览器中访问 127.0.0.1:8000。 它将显示 Django 启动页面:

接下来,您将创建一个 Django 应用程序并将您的项目配置为从该应用程序运行视图,这样您将看到比默认页面更有趣的内容。

第 2 步——制作一个基本的 Django 应用程序

在此步骤中,您将创建将保存 Droplet 结果的应用程序框架。 一旦您设置了 API 调用以使用数据填充它,您稍后会回到这个应用程序。

确保您在 do_django_project 目录中,并使用以下命令创建一个 Django 应用程序:

python3 manage.py startapp display_droplets

现在您需要将新应用添加到 settings.py 文件中的 INSTALLED_APPS 中,以便 Django 识别它。 settings.py 是一个 Django 配置文件,它位于 Django 项目的另一个子目录中,与项目文件夹 (do_django_project) 同名。 Django 为您创建了这两个文件夹。 切换到do_django_project目录:

cd do_django_project

在您选择的编辑器中编辑 settings.py

nano settings.py

将您的新应用添加到文件的 INSTALLED_APPS 部分:

do_django_api/do_django_project/do_django_project/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # The new app
    'display_droplets',
]

完成后保存并关闭文件。

GetDroplets 视图函数

接下来,您将在 display_droplets 应用程序的 views.py 文件中创建一个函数 GetDroplets。 此函数将从 API 呈现用于显示 Droplet 数据的模板,如 contextcontext 是一个字典,用于从 Python 代码中获取数据并将其发送到 HTML 模板,以便在网页中显示。

切换到display_droplets目录:

cd ..
cd display_droplets

打开views.py进行编辑:

nano views.py

将以下代码添加到文件中:

do_django_api/do_django_project/display_droplets/views.py

from django.views.generic import TemplateView

class GetDroplets(TemplateView):
    template_name = 'droplets.html'
    def get_context_data(self, *args, **kwargs):
        pass

保存并关闭文件。

稍后您将填充此函数并创建 droplets.html 文件,但首先让我们配置 urls.py 以在您访问开发服务器根目录(127.0.0.1:8000)时调用此函数。

切换回do_django_project目录:

cd ..
cd do_django_project

打开urls.py进行编辑:

nano urls.py

GetDroplets 添加一个 import 语句,然后添加一个指向新视图的 urlpatterns 的附加路径。

do_django_api/do_django_project/do_django_project/urls.py

from django.contrib import admin
from django.urls import path
from display_droplets.views import GetDroplets

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', GetDroplets.as_view(template_name='droplets.html'), name='Droplet View'),
]

如果你想制作自己的自定义路径,第一个参数是 URL(如 example.com/**admin**),第二个参数是调用生成网页的函数,第三个只是一个名称小路。

保存并关闭文件。

水滴模板

接下来,您将使用 模板 。 模板是 Django 用来创建网页的 HTML 文件。 在本例中,您将使用模板来构建显示 API 数据的 HTML 页面。

切换回display_droplets目录:

cd ..
cd display_droplets

在此目录中,创建一个 template 文件夹并切换到该目录:

mkdir templates
cd templates

创建 droplets.html 并打开它进行编辑:

nano droplets.html

为了避免为这个项目编写任何类型的 CSS,我们将使用 Bulma CSS,因为它是一个免费且轻量级的 CSS 框架,允许您通过添加一些类属性来创建看起来干净的网页到 HTML。

现在让我们创建一个带有基本导航栏的模板。 将以下代码添加到 droplets.html 文件中。

do_django_api/do_django_project/display_droplets/templates/droplets.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DigitalOcean Droplets</title>
    <link crossorigin="anonymous"
          href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.min.css"
          integrity="sha256-8B1OaG0zT7uYA572S2xOxWACq9NXYPQ+U5kHPV1bJN4="
          rel="stylesheet"/>
    <link rel="shortcut icon" type="image/png" href="https://assets.digitalocean.com/logos/favicon.png"/>
</head>
<body>
<nav aria-label="main navigation" class="navbar is-light" role="navigation">
    <div class="navbar-brand">
        <div class="navbar-item">
            <img atl="DigitalOcean" src="https://assets.digitalocean.com/logos/DO_Logo_icon_blue.png"
                 style="margin-right: 0.5em;">Droplets
        </div>
    </div>
</nav>
</body>
</html>

保存并关闭文件。

此代码将 Bulma 导入到样板 HTML 中,并创建一个显示“Droplet”的 nav 栏。

刷新浏览器选项卡以查看您对模板所做的更改。

到目前为止,您还没有接触过任何与 API 相关的东西; 您已经为该项目奠定了基础。 接下来,您将通过调用 API 并显示 Droplet 数据来充分利用此页面。

第 3 步 — 进行 API 调用

在此步骤中,您将设置 API 调用并将 Droplet 数据作为上下文发送到模板以显示在表格中。

获取液滴数据

导航回 display_droplets 应用程序目录:

cd ..

安装 请求库 以便您可以与 API 对话:

pip install requests

requests 库使您的代码能够从 API 请求数据并添加标头(与我们的请求一起发送的附加数据)。

接下来,您将创建一个 services.py 文件,您将在其中进行 API 调用。 此函数将使用 requestshttps://api.digitalocean.com/v2/droplets 对话,并将返回的 JSON 文件中的每个 Droplet 附加到列表中。

打开services.py进行编辑:

nano services.py

将以下代码添加到文件中:

do_django_api/do_django_project/display_droplets/services.py

import os
import requests

def get_droplets():
    url = 'https://api.digitalocean.com/v2/droplets'
    r = requests.get(url, headers={'Authorization':'Bearer %s' % 'access_token'})
    droplets = r.json()
    droplet_list = []
    for i in range(len(droplets['droplets'])):
        droplet_list.append(droplets['droplets'][i])
    return droplet_list

get_droplets 函数内部,会发生两件事:发出请求和解析数据。 url 包含从 DigitalOcean API 请求 Droplet 数据的 URL。 r 存储请求的数据。

requests 在这种情况下有两个参数:urlheaders。 如果您想要来自不同 API 的数据,您可以将 url 值替换为适当的 URL。 headers 向 DigitalOcean 发送您的访问令牌,因此他们知道您可以提出请求以及该请求是针对哪个帐户发出的。

droplets 包含来自 r 变量的信息,但现在它已从 API 发送信息的格式 JSON 转换为易于使用的字典for 循环。

接下来的三行创建一个数组 droplet_list[]。 然后 for 循环遍历 droplets 中的信息,并将每个项目添加到列表中。 从 API 获取并存储在 droplets 中的所有信息都可以在 DigitalOcean 的开发者文档 中找到。

注意:不要忘记用你的访问令牌替换access_token。 此外,请确保其安全,切勿在线发布该令牌。


保存并关闭文件。

保护您的访问令牌

您应该始终隐藏您的访问令牌,但如果有人想要运行您的项目,您应该有一种简单的方法让他们添加自己的访问令牌,而无需编辑 Python 代码。 DotENV 是解决方案,因为变量保存在 .env 文件中,可以方便地进行编辑。

导航回 do_django_project 目录:

cd ..

要开始使用环境变量,请安装 python-dotenv

pip install python-dotenv

安装后,您需要配置 Django 来处理环境变量,以便您可以在代码中引用它们。 为此,您需要在 manage.pywsgi.py 中添加几行代码。

打开manage.py进行编辑:

nano manage.py

添加以下代码:

do_django_api/do_django_project/manage.py

"""Django's command-line utility for administrative tasks."""
import os
import sys
import dotenv

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_django_project.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)

if __name__ == '__main__':
    main()

dotenv.load_dotenv(
    os.path.join(os.path.dirname(__file__), '.env')
)

manage.py 中添加它意味着当您在开发中向 Django 发出命令时,它将处理来自您的 .env 文件的环境变量。

保存并关闭文件。

如果您需要在生产项目中处理环境变量,您可以从 wsgi.py 文件中完成。 切换到 do_django_project 目录:

cd do_django_project

并打开wsgi.py进行编辑:

nano wsgi.py

将以下代码添加到 wsgi.py

do_django_api/do_django_project/do_django_project/wsgi.py

import os
import dotenv

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_django_project.settings')

dotenv.load_dotenv(
    os.path.join(os.path.dirname(os.path.dirname(__file__)), '.env')
)

application = get_wsgi_application()

这个代码片段有一个额外的 os.path.dirname() 因为 wsgi.py 需要返回两个目录才能找到 .env 文件。 此片段与用于 manage.py 的片段不同。

保存并关闭文件。

现在您可以在 services.py 中使用环境变量来代替您的访问令牌。 切换回display_droplets目录:

cd ..
cd display_droplets

打开services.py进行编辑:

nano services.py

现在用环境变量替换您的访问令牌:

do_django_api/display_droplets/services.py

import os
import requests

def get_droplets():
    url = "https://api.digitalocean.com/v2/droplets"
    r = requests.get(url, headers={'Authorization':'Bearer %s' % os.getenv('DO_ACCESS_TOKEN')})
    droplets = r.json()
    droplet_list = []
    for i in range(len(droplets['droplets'])):
        droplet_list.append(droplets['droplets'][i])
    return droplet_list

保存并关闭文件。

下一步是创建一个 .env 文件。 切换回do_django_project目录:

cd ..

创建一个 .env 文件并用笔将文件进行编辑:

nano .env

.env 中,将您的令牌添加为变量 DO_ACCESS_TOKEN

do_django_api/do_django_project/.env

DO_ACCESS_TOKEN=access_token

保存并关闭文件。

注意:.env 添加到您的 .gitignore 文件中,这样它就不会包含在您的提交中。


API 连接现已设置和配置,并且您还保护了访问令牌。 是时候向用户展示您检索到的信息了。

第 4 步 - 处理视图和模板中的 Droplet 数据

现在您可以进行 API 调用,您需要将 Droplet 数据发送到模板进行渲染。 让我们回到之前在 views.py 中创建的函数的存根 GetDroplets。 在函数中,您将 droplet_list 作为上下文发送到 droplets.html 模板。

切换到display_droplets目录:

cd display_droplets

打开views.py进行编辑:

nano views.py

将以下代码添加到 views.py

do_django_api/do_django_project/display_droplets/views.py

from django.shortcuts import render
from django.views.generic import TemplateView
from .services import get_droplets

class GetDroplets(TemplateView):
    template_name = 'droplets.html'
    def get_context_data(self, *args, **kwargs):
        context = {
            'droplets' : get_droplets(),
        }
        return context

发送到 droplets.html 模板的信息通过 context 字典处理。 这就是为什么 droplets 充当键,而从 get_droplets() 返回的数组充当值的原因。

保存并关闭文件。

在模板中呈现数据

droplets.html 模板中,您将创建一个表格并使用液滴数据填充它。

切换到templates目录:

cd templates

打开droplets.html进行编辑:

nano droplets.html

droplets.html 中的 nav 元素之后添加以下代码:

do_django_api/do_django_project/display_droplets/templates/droplets.html

<table class="table is-fullwidth is-striped is-bordered">
    <thead>
    <tr>
        <th>Name</th>
        <th>IPv4 Address(es)</th>
        <th>Id</th>
        <th>Region</th>
        <th>Memory</th>
        <th>CPUs</th>
        <th>Disk Size</th>
    </tr>
    </thead>
    <tbody>
    {% for droplet in droplets %}
    <tr>
        <th>{{ droplet.name }}</th>
        {% for ip in droplet.networks.v4 %}
        <td>{{ ip.ip_address }}</td>
        {% endfor %}
        <td>{{ droplet.id }}</td>
        <td>{{ droplet.region.name }}</td>
        <td>{{ droplet.memory }}</td>
        <td>{{ droplet.vcpus }}</td>
        <td>{{ droplet.disk }}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>

{% for droplet in droplets %} ... {% endfor %} 是一个循环,它遍历从 views.py 检索到的 Droplet 数组。 每个 Droplet 都插入到表格行中。 不同的 {{ droplet.<attribute> }} 行为循环中的每个 Droplet 检索该属性,并将其插入表格单元格中。

保存并关闭文件。

刷新您的浏览器,您将看到一个 Droplet 列表。

您现在可以在 Django 项目中处理 DigitalOcean API。 您已经获取了从 API 检索到的数据并将其插入到您之前创建的模板中,以便以可读且灵活的方式显示信息。

结论

在本文中,您构建了一个 Django 项目,该项目可以使用 Bulma CSS 样式显示来自 DigitalOcean API 的 Droplet 信息。 通过遵循本教程,您已经学习了三项重要技能:

  • 如何使用 requestsjson 模块在 Python 中处理 API 请求。
  • 如何使用 viewtemplate 逻辑在 Django 项目中显示 API 数据。
  • 如何在 Django 中使用 dotenv 安全地处理您的 API 令牌。

现在您已经了解了如何在 Django 中处理 API,您可以使用 DigitalOcean API 中的其他功能或完全使用其他 API 创建自己的项目。 您还可以查看 其他 Django 教程 或使用 React 框架 类似教程。