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

作者选择了 Mozilla 基金会作为 写给捐款计划的一部分,以接收捐款。

介绍

随着对全库开发的需求继续增长,网络框架正在使开发工作流程减少繁琐和提高效率;Django就是其中之一。 Django被用于主要网站,如Mozilla、[PINK2]和Instagram。 与[Flask] (https://flask.palletsprojects.com/en/1.1.x/)这个中性微框架不同,Django PyPI包包含了你需要的全存储开发的一切;不需要为开发建立一个数据库或控制面板.

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

在本教程中,您将构建一个 Django 项目,使用 DigitalOcean v2 API显示您的 DigitalOcean 帐户的 Droplet 信息。具体来说,您将创建一个网站,该网站将显示一张 Droplets 表,列出每个 IP 地址、ID、托管区域和资源。

一旦您完成本教程,您将有一个Django项目,可以制作一个看起来像这样的网页:

Template with Table of Droplet Data

前提条件

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

  • DigitalOcean账户,至少有一个Droplet,以及一个[个人访问符 (https://andsky.com/tech/tutorials/how-to-use-the-digitalocean-api-v2# how-to-generate-a-personal-access-token). 一定要在安全的地方录下信物;以后在这个教程中会需要它.
  • 向API提出要求的熟悉程度。 关于与API合作的综合教程,请查看[Python3中如何使用Web API(https://andsky.com/tech/tutorials/how-to-use-web-apis-in-python-3).
  • Python的本地虚拟环境,用于维持依赖性. 在这个教程中,我们将使用do-django-api'作为我们的项目目录,env'作为我们的虚拟环境。
  • 熟悉Django用API数据渲染页面的模板逻辑。
  • 熟悉Django的观点处理从API中取回的数据的逻辑,并把它交给一个模板进行渲染. .

第1步:创建一个基本的Django项目

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

1pip install Django

现在你可以开始一个Django项目,并运行一些初始设置命令。

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

1django-admin startproject do_django_project
2cd do_django_project

一旦它被创建,在这个子目录中,你会发现manage.py,这是与Django互动并运行您的项目的常见方式。

1python3 manage.py migrate

您将看到像数据库更新这样的输出:

 1[secondary_label Output]
 2Operations to perform:
 3  Apply all migrations: admin, auth, contenttypes, sessions
 4Running migrations:
 5  Applying contenttypes.0001_initial... OK
 6  Applying auth.0001_initial... OK
 7  Applying admin.0001_initial... OK
 8  Applying admin.0002_logentry_remove_auto_add... OK
 9  Applying admin.0003_logentry_add_action_flag_choices... OK
10  Applying contenttypes.0002_remove_content_type_name... OK
11  Applying auth.0002_alter_permission_name_max_length... OK
12  Applying auth.0003_alter_user_email_max_length... OK
13  Applying auth.0004_alter_user_username_opts... OK
14  Applying auth.0005_alter_user_last_login_null... OK
15  Applying auth.0006_require_contenttypes_0002... OK
16  Applying auth.0007_alter_validators_add_error_messages... OK
17  Applying auth.0008_alter_user_username_max_length... OK
18  Applying auth.0009_alter_user_last_name_max_length... OK
19  Applying auth.0010_alter_group_name_max_length... OK
20  Applying auth.0011_update_proxy_permissions... OK
21  Applying sessions.0001_initial... OK

接下来,使用runserver命令来运行该项目,以便您可以测试它:

1python3 manage.py runserver

当服务器启动时,输出将看起来像这样:

1[secondary_label Output]
2Watching for file changes with StatReloader
3Performing system checks...
4
5System check identified no issues (0 silenced).
6September 22, 2019 - 22:57:07
7Django version 2.2.5, using settings 'do_django_project.settings'
8Starting development server at http://127.0.0.1:8000/
9Quit the server with CONTROL-C.

你现在有一个基本的Django项目和一个正在运行的开发服务器。 要查看正在运行的开发服务器,请在浏览器中访问‘127.0.0.1:8000’。

Generic Django Start-Page

接下来,您将创建一个Django应用程序,并配置您的项目以从该应用程序中运行视图,以便您看到比默认页面更有趣的东西。

第2步:创建一个基本的Django应用程序

在此步骤中,您将创建该应用程序的骨骼,该应用程序将保留您的 Droplet 结果. 您将在稍后设置 API 调用后返回该应用程序以填充数据。

请确保您位于 do_django_project 目录中,并使用以下命令创建 Django 应用程序:

1python3 manage.py startapp display_droplets

现在你需要在settings.py文件中将新应用程序添加到INSTALLED_APPS,以便Django可以识别它。settings.py是Django配置文件,位于Django项目的另一个子目录中,与项目文件夹(do_django_project)相同的名称。

1cd do_django_project

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

1nano settings.py

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

 1[label do_django_api/do_django_project/do_django_project/settings.py]
 2INSTALLED_APPS = [
 3    'django.contrib.admin',
 4    'django.contrib.auth',
 5    'django.contrib.contenttypes',
 6    'django.contrib.sessions',
 7    'django.contrib.messages',
 8    'django.contrib.staticfiles',
 9    # The new app
10    'display_droplets',
11]

保存并关闭文件,当你完成。

GetDroplets 查看功能

接下来,您将创建一个函数,即GetDroplets,在display_droplets应用程序的views.py文件中。这个函数将使您将使用的模板从API中显示Droplet数据,作为背景

转到display_droplets目录:

1cd ..
2cd display_droplets

打开views.py来编辑:

1nano views.py

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

1[label do_django_api/do_django_project/display_droplets/views.py]
2from django.views.generic import TemplateView
3
4class GetDroplets(TemplateView):
5    template_name = 'droplets.html'
6    def get_context_data(self, *args, **kwargs):
7        pass

保存并关闭文件。

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

返回do_django_project目录:

1cd ..
2cd do_django_project

打开 urls.py 来编辑:

1nano urls.py

GetDroplets添加一个导入陈述,然后向urlpatterns添加一个额外的路径,该路径将指向新视图。

1[label do_django_api/do_django_project/do_django_project/urls.py]
2from django.contrib import admin
3from django.urls import path
4from display_droplets.views import GetDroplets
5
6urlpatterns = [
7    path('admin/', admin.site.urls),
8    path('', GetDroplets.as_view(template_name='droplets.html'), name='Droplet View'),
9]

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

保存并关闭文件。

Dropplets 模板

接下来,您将使用 templates. 模板是 Django 使用创建网页的 HTML 文件. 在这种情况下,您将使用模板来构建显示 API 数据的 HTML 页面。

返回display_droplets目录:

1cd ..
2cd display_droplets

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

1mkdir templates
2cd templates

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

1nano droplets.html

为了避免为这个项目写任何类型的CSS,我们将使用Bulma CSS(https://bulma.io/),因为它是一个免费的和轻量级的CSS框架,允许您通过添加几个类属性来创建干净的网页。

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

 1[label do_django_api/do_django_project/display_droplets/templates/droplets.html]
 2<!DOCTYPE html>
 3<html lang="en">
 4<head>
 5    <meta charset="UTF-8">
 6    <title>DigitalOcean Droplets</title>
 7    <link crossorigin="anonymous"
 8          href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.min.css"
 9          integrity="sha256-8B1OaG0zT7uYA572S2xOxWACq9NXYPQ+U5kHPV1bJN4="
10          rel="stylesheet"/>
11    <link rel="shortcut icon" type="image/png" href="https://assets.digitalocean.com/logos/favicon.png"/>
12</head>
13<body>
14<nav aria-label="main navigation" class="navbar is-light" role="navigation">
15    <div class="navbar-brand">
16        <div class="navbar-item">
17            <img atl="DigitalOcean" src="https://assets.digitalocean.com/logos/DO_Logo_icon_blue.png"
18                 style="margin-right: 0.5em;">Droplets
19        </div>
20    </div>
21</nav>
22</body>
23</html>

保存并关闭文件。

此代码将 Bulma 导入到 boilerplate HTML 中,并创建一个显示Dropletsnav栏。

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

Template with Basic Header

到目前为止,您还没有触及任何与 API 相关的内容;您已经为该项目创建了一个基础,接下来您将通过进行 API 调用并呈现 Droplet 数据来充分利用此页面。

步骤 3 – 进行 API 调用

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

获取漏洞数据

返回display_droplets应用程序目录:

1cd ..

安裝 requests 圖書館,以便您可以與 API 進行對話:

1pip install requests

请求库允许您的代码从 API 请求数据,并添加标题(与我们的请求一起发送的额外数据)。

接下来,你会创建一个 services.py 文件,这是你将进行 API 调用的地方. 这个函数将使用 requests' 来与 https://api.digitalocean.com/v2/droplets' 交谈,并附加返回列表的 JSON 文件中的每个 Droplet。

打开services.py来编辑:

1nano services.py

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

 1[label do_django_api/do_django_project/display_droplets/services.py]
 2import os
 3import requests
 4
 5def get_droplets():
 6    url = 'https://api.digitalocean.com/v2/droplets'
 7    r = requests.get(url, headers={'Authorization':'Bearer %s' % 'access_token'})
 8    droplets = r.json()
 9    droplet_list = []
10    for i in range(len(droplets['droplets'])):
11        droplet_list.append(droplets['droplets'][i])
12    return droplet_list

get_droplets函数中,发生了两件事:一个请求和数据被解析。url包含从DigitalOcean API请求Droplet数据的URL。

请求在这种情况下需要两个参数:url标题。如果你想要来自不同的API的数据,你会用适当的URL代替url值。

dropplets包含从r变量的信息,但现在它已经从JSON转换,该格式的API发送信息,到一个字典,这是易于在循环中使用。

接下来的三个行会创建一个数组,dropplet_list[]。然后一个for循环会重复dropplets中的信息,并将每个项目添加到列表中。

<$>[注] 注: 不要忘了用你的访问令牌代替access_token

保存并关闭文件。

保护您的访问代码

你应该总是隐藏你的访问代码,但如果有人想运行你的项目,你应该有一个简单的方法,让他们添加自己的访问代码,而无需编辑Python代码。

返回do_django_project目录:

1cd ..

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

1pip install python-dotenv

一旦安装,您需要配置 Django 来处理环境变量,以便您可以将其引用到代码中。

打开manage.py来编辑:

1nano manage.py

添加以下代码:

 1[label do_django_api/do_django_project/manage.py]
 2
 3"""Django's command-line utility for administrative tasks."""
 4import os
 5import sys
 6import dotenv
 7
 8def main():
 9    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_django_project.settings')
10    try:
11        from django.core.management import execute_from_command_line
12    except ImportError as exc:
13        raise ImportError(
14            "Couldn't import Django. Are you sure it's installed and "
15            "available on your PYTHONPATH environment variable? Did you "
16            "forget to activate a virtual environment?"
17        ) from exc
18    execute_from_command_line(sys.argv)
19
20if __name__ == '__main__':
21    main()
22
23dotenv.load_dotenv(
24    os.path.join(os.path.dirname(__file__), '.env')
25)

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

保存并关闭文件。

如果您需要在生产项目中处理环境变量,您可以从wsgi.py文件中这样做。

1cd do_django_project

然后打开wsgi.py来编辑:

1nano wsgi.py

将以下代码添加到 wsgi.py:

 1[label do_django_api/do_django_project/do_django_project/wsgi.py]
 2
 3import os
 4import dotenv
 5
 6from django.core.wsgi import get_wsgi_application
 7
 8os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_django_project.settings')
 9
10dotenv.load_dotenv(
11    os.path.join(os.path.dirname(os.path.dirname(__file__)), '.env')
12)
13
14application = get_wsgi_application()

这个代码片段有一个额外的os.path.dirname(),因为wsgi.py需要回顾两个目录以找到.env文件。

保存并关闭文件。

现在,您可以使用services.py中的环境变量,而不是您的访问代码。

1cd ..
2cd display_droplets

打开services.py来编辑:

1nano services.py

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

 1[label do_django_api/display_droplets/services.py]
 2import os
 3import requests
 4
 5def get_droplets():
 6    url = "https://api.digitalocean.com/v2/droplets"
 7    r = requests.get(url, headers={'Authorization':'Bearer %s' % os.getenv('DO_ACCESS_TOKEN')})
 8    droplets = r.json()
 9    droplet_list = []
10    for i in range(len(droplets['droplets'])):
11        droplet_list.append(droplets['droplets'][i])
12    return droplet_list

保存并关闭文件。

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

1cd ..

创建一个 .env 文件,并将该文件用于编辑:

1nano .env

.env 中,将您的代币添加为变量 DO_ACCESS_TOKEN:

1[label do_django_api/do_django_project/.env]
2DO_ACCESS_TOKEN=access_token

保存并关闭文件。

<$>[注] 注:.env 添加到您的 .gitignore 文件中,以便它永远不会被包含在您的委托中。

API 连接现在已设置和配置,您也已经保护了您的访问代码,现在是时候向用户展示您获取的信息了。

步骤 4 — 在视图和模板中处理滴滴数据

现在你可以进行API调用,你需要将Droplet数据发送到模板进行渲染。让我们回到函数的支柱,GetDroplets,你在views.py中创建的。

转到display_droplets目录:

1cd display_droplets

打开views.py来编辑:

1nano views.py

将以下代码添加到「views.py」中:

 1[label do_django_api/do_django_project/display_droplets/views.py]
 2from django.shortcuts import render
 3from django.views.generic import TemplateView
 4from .services import get_droplets
 5
 6class GetDroplets(TemplateView):
 7    template_name = 'droplets.html'
 8    def get_context_data(self, *args, **kwargs):
 9        context = {
10            'droplets' : get_droplets(),
11        }
12        return context

droplets.html模板发送的信息通过背景字典进行处理,这就是为什么droplets作为一个密钥,而从get_droplets()返回的数组作为一个值。

保存并关闭文件。

在模板中呈现数据

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

转到templates目录:

1cd templates

打开droplets.html来编辑:

1nano droplets.html

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

 1[label do_django_api/do_django_project/display_droplets/templates/droplets.html]
 2<table class="table is-fullwidth is-striped is-bordered">
 3    <thead>
 4    <tr>
 5        <th>Name</th>
 6        <th>IPv4 Address(es)</th>
 7        <th>Id</th>
 8        <th>Region</th>
 9        <th>Memory</th>
10        <th>CPUs</th>
11        <th>Disk Size</th>
12    </tr>
13    </thead>
14    <tbody>
15    {% for droplet in droplets %}
16    <tr>
17        <th>{{ droplet.name }}</th>
18        {% for ip in droplet.networks.v4 %}
19        <td>{{ ip.ip_address }}</td>
20        {% endfor %}
21        <td>{{ droplet.id }}</td>
22        <td>{{ droplet.region.name }}</td>
23        <td>{{ droplet.memory }}</td>
24        <td>{{ droplet.vcpus }}</td>
25        <td>{{ droplet.disk }}</td>
26    </tr>
27    {% endfor %}
28    </tbody>
29</table>

{% for droplet in droplets %}... {% endfor %}' 是一个循环,通过从 views.py` 获取的 Droplets 数组迭代。

保存并关闭文件。

刷新您的浏览器,你会看到一个列表的Dropplets。

Template with Table of Droplet Data

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

结论

在本文中,你建立了一个Django项目,可以显示DigitalOcean API的Droplet信息,使用Bulma CSS风格。

  • 如何在 Python 中使用请求json模块处理 API 请求 * 如何在 Django 项目中使用查看模板逻辑显示 API 数据 * 如何在 Django 中使用dotenv安全地处理 API 代币。

现在你已经了解了如何在Django中处理API,你可以使用DigitalOcean API的另一个功能或完全不同的API来创建自己的项目,你也可以查看其他Django教程(https://andsky.com/tech/tutorials/how-to-build-a-modern-web-application-to-manage-customer-information-with-django-and-react-on-ubuntu-18-04)或类似的React框架教程(https://andsky.com/tech/tutorials/how-to-display-data-from-the-digitalocean-api-with-react)。

Published At
Categories with 技术
comments powered by Disqus