如何在Django中使用Python与DigitalOcean空间解耦

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

介绍

Python Decouple 是一个 Python 库,旨在使开发人员更容易将其配置设置与代码分离。 它最初是为 Django 设计的,现在是一个通用的 Python 工具,用于存储参数和定义与代码分开的常量值。

在本教程中,我们将介绍如何安装 Python Decouple 以及如何在使用 DigitalOcean 的对象存储解决方案 Spaces 的基本 Django 应用程序中使用它。

先决条件

为了为本教程做好充分准备,您将需要以下内容:

  • 在 Ubuntu 或 Debian Linux 服务器上设置的具有 sudo 权限的非 root 用户帐户。 如果您还没有设置,请按照 Ubuntu 16.04Debian 的初始服务器设置教程进行操作。
  • 一个 DigitalOcean Space 和一个生成的 API 密钥。 有关这方面的指导,您可以按照此 教程创建空间并设置 API 密钥

有了初始服务器设置和 DigitalOcean Space 和 API 密钥,您就可以开始了。

第 1 步 — 设置虚拟环境

在我们开始之前,如果您还没有这样做,那么现在是更新和升级服务器的好时机。

sudo apt-get update && sudo apt-get -y upgrade

您的服务器应该附带 Python 3。 运行以下命令以验证它是否已安装:

sudo apt-get install python3

接下来,让我们为 Python 安装 pip 包管理器。

sudo apt-get install -y python3-pip

最后,我们需要安装 virtualenv 模块,以便我们可以设置我们的编程环境:

sudo pip3 install virtualenv

有关设置和使用编程环境的更多指导和信息,请查看设置虚拟环境的教程。

我们现在准备好进入我们的 Python 编程环境。

第 2 步 - 创建 Django 应用程序并安装依赖项

接下来我们必须创建 Django 应用程序并安装所需的依赖项,以便利用 DigitalOcean Spaces 和 Python Decouple。

在服务器的主目录中,我们必须创建包含 Django 应用程序的目录。 运行以下命令以创建一个名为 django-apps 或您选择的其他名称的目录。 然后导航到目录。

mkdir django-apps
cd django-apps 

django-apps 目录中,创建您的虚拟环境。 我们称它为 env

virtualenv env

现在,使用以下命令激活虚拟环境:

. env/bin/activate

一旦前缀更改为 (env),您就会知道它已被激活,根据您所在的目录,它看起来类似于以下内容:


在环境中,使用 pip 安装 Django 包。 安装 Django 允许我们创建和运行 Django 应用程序。 要了解有关 Django 的更多信息,请阅读我们关于 Django 开发 的教程系列。

pip install django

现在让我们使用以下命令创建一个名为 mysite 的 Django 项目:

django-admin startproject mysite

接下来,我们需要安装 Boto 3,这是一个适用于 Python 的 AWS 开发工具包,它允许我们将对象存储解决方案(如 DigitalOcean Spaces)与我们的 Django 应用程序集成。

在撰写本文时,Boto 3 与 S3 具有明确的兼容性。 由于 Space 与 S3 的互操作性,Spaces 也与 Boto 3 兼容。 有关 Amazon S3 和 DigitalOcean Spaces 对象存储之间比较的更多详细信息,请阅读 Spaces 文档

运行以下命令安装 Boto 3:

pip install boto3

我们还需要安装 django-storages,这是 Django 和 boto3 的自定义存储后端的集合。

pip install django-storages

最后,让我们安装 Python Decouple**。

pip install python-decouple

您已经在 Django 应用程序的环境中设置了依赖项,现在可以设置静态和模板目录。

第 3 步 - 添加目录和资产

设置好所有依赖项的环境后,您现在可以切换到 mysite/mysite 目录,

cd ~/django-apps/mysite/mysite

mysite/mysite 目录中,运行以下命令创建静态和模板目录。

mkdir static && mkdir templates

接下来,我们将创建图像和 CSS 的子目录以存在于 static 目录中。

mkdir static/img && mkdir static/css

创建目录后,我们将下载一个测试文件,最终将其添加到我们的对象存储中。 切换到 img 目录,因为我们将下载图像。

cd ~/django-apps/mysite/mysite/static/img

在此目录中,我们将使用 Wget 的 wget 命令下载 DigitalOcean 徽标图像。 这是一个常用的 GNU 程序,预装在 Ubuntu 发行版上,用于从 Web 服务器检索内容。

wget https://assets.digitalocean.com/logos/DO_Logo_icon_blue.png

点击 ENTER 后,您将看到类似于以下内容的输出:

OutputResolving www.digitalocean.com (www.digitalocean.com)... 104.16.24.4, 104.16.25.4
Connecting to www.digitalocean.com (www.digitalocean.com)|104.16.24.4|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1283 (1.3K) [image/png]
Saving to: ‘DO_Logo_icon_blue.png’

DO_Logo_icon_blue-6edd7377 100%[=====================================>]   1.25K  --.-KB/s    in 0s      

2017-11-05 12:26:24 (9.60 MB/s) - ‘DO_Logo_icon_blue.png’ saved [1283/1283]

此时,如果您运行命令 ls,您会注意到一个名为 DO_Logo_icon_blue.png 的图像现在存在于 static/img/ 目录中。

设置好这些目录并将我们要存储的图像下载到服务器后,我们可以继续编辑与我们的 Django 应用程序关联的文件。

第 4 步 — 编辑 CSS 和 HTML 文件

我们将从编辑样式表开始。 您应该进入 css 目录,以便我们可以为我们的 Web 应用程序添加基本样式表。

cd ~/django-apps/mysite/mysite/static/css

使用 nano 或您选择的其他文本编辑器来编辑文档。

nano app.css

文件打开后,添加以下 CSS:

应用程序.css

body {
  margin: 0;
  background-color: #f1f1f1;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}

.container {
  width: 80%;
  border: 1px solid #ddd;
  background-color: #fff;
  padding: 20px;
  margin: 40px auto;
}

form {
  margin-bottom: 20px;
  padding: 10px;
  border: 1px solid #ff9900;
  width: 350px;
}

table {
  border-collapse: collapse;
  width: 100%;
}

table td,
table th {
  border: 1px solid #eceeef;
  padding: 5px 8px;
  text-align: left;
}

table thead {
  border-bottom: 2px solid #eceeef;
}

完成后,您可以保存并关闭文件。

从这里,导航到 templates 目录。

cd ~/django-apps/mysite/mysite/templates

我们需要打开一个名为 home.html 的文件并将 HTML 添加到其中,以显示我们的基本 Web 应用程序。 使用 nano 打开文件,以便进行编辑:

nano home.html

在文档中,添加以下内容:

主页.html

{% load static %}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Spaces + Django Tutorial</title>
  <link rel="stylesheet" type="text/css" href="{% static 'css/app.css' %}">
</head>
<body>
  <center>
  <header>
    <h1>Spaces + Django Tutorial</h1>
  </header>
  <main>
    <img src="{% static 'img/DO_Logo_icon_blue.png' %}">
    <h2>Congratulations, you’re using Spaces!</h2>
  </main>
  </center>
</body>
</html>

保存并关闭文件。 我们将更新的最后一个文件是 urls.py 文件,以便它指向您新创建的 home.html 文件。 我们需要进入以下目录:

cd ~/django-apps/mysite/mysite

使用 nano 编辑 urls.py 文件。

nano urls.py

您可以删除文件中的所有内容,然后添加以下内容:

网址.py

from django.conf.urls import url
from django.views.generic import TemplateView


urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='home.html'), name='home'),
]

设置好这些文件后,我们接下来可以配置我们的设置,以便与对象存储集成。

第 5 步 — 使用 Python 解耦来抽象空间凭证

在您的虚拟环境中,导航到 settings.py 文件的位置。 我们将在此处创建 settings.ini 文件以单独存储您的凭据。

cd ~/django-apps/mysite/mysite

使用 touch 创建 settings.ini 文件,这是一个 Linux 命令,可在调用它的目录中创建新的空文件。

touch settings.ini

正在创建的设置文件将具有 .ini 文件扩展名。 Python Decouple 将查看此文件以获取设置数据,它也是您的设置文件将引用的 API 密钥的位置。 您还可以使用 .env 作为 .ini 的替代扩展。

现在,使用您喜欢的文本编辑器(例如 nano)打开 settings.ini 文件。

nano settings.ini

在本文档中,我们将有一个节标题 [settings],这是 Python 解耦所需的,并将通过将它们分配给 变量 来添加我们的 Spaces 凭据。 您的完整文件应如下所示:

设置.ini

[settings]
SPACES_ACCESS_KEY=your-spaces-access-key
SPACES_SECRET_ACCESS_KEY=your-spaces-secret-access-key

为了访问这些凭据,我们需要从 settings.py 文件中引用 settings.ini 文件。

在下一步中,我们将完成对 settings.py 文件的完整配置。

第 6 步 — 更新设置

现在是时候使用您的 Spaces 凭据更新您的设置文件,以便我们可以利用我们设置的页面来显示图像。

确保您位于正确的位置以访问您的设置文件。

cd ~/django-apps/mysite/mysite

使用 nano 或其他文本编辑器打开文件进行编辑:

nano settings.py

在文件的顶部,我们需要添加一个 import 语句 以便使用 Decouple 的配置模块。

设置.py

...
import os
from decouple import config
...

在文件中向下移动到允许的主机并添加您的服务器 IP。

设置.py

...
ALLOWED_HOSTS = ['your-server-ip']
...

然后将 storages 添加到设置文件的已安装应用程序部分并删除 django.contrib.admin,因为我们不会在本教程中使用它。 它应该如下所示。

设置.py

...
# Application definition

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'storages'
]
...

将突出显示的文本替换并添加到设置文件的 TEMPLATES 部分,以便项目知道在哪里找到您的 home.html 文件。

设置.py

...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'mysite/templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
...

最后,让我们在文件底部更新您的设置。 我们将在 # Static files 部分下方添加以下内容。 前两行添加对 settings.ini 文件的引用,以便它可以检索配置参数。

在此之下,请务必添加您自己的存储桶名称。 在撰写本文时,NYC3 是 Spaces 当前所在的唯一区域,因此它作为端点 URL 传递。

对于终端位置,添加要导入文件的目录。 您可以通过浏览器中的 Spaces 界面添加目录。

设置.py

...
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

AWS_ACCESS_KEY_ID = config('SPACES_ACCESS_KEY')
AWS_SECRET_ACCESS_KEY = config('SPACES_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = 'your-storage-bucket-name'
AWS_S3_ENDPOINT_URL = 'https://nyc3.digitaloceanspaces.com'
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'your-spaces-files-folder'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'mysite/static'),
]
STATIC_URL = 'https://%s/%s/' % (AWS_S3_ENDPOINT_URL, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

现在我们已经从 Python 代码中提取了 Spaces 凭据,并且我们的设置文件已准备好将我们的 Django 应用程序与对象存储集成。

让我们运行 Django Web 应用程序来验证所有设置是否正确。

第 7 步 — 收集静态文件

现在我们将运行 collectstatic,您会注意到正在传输的文件,包括我们保存在静态目录中的图像。 它将被传输到我们在设置文件中确定的空间位置。

为此,让我们导航到 ~/django-apps/mysite/

cd ~/django-apps/mysite

在目录中,运行以下命令:

python manage.py collectstatic

您将看到以下输出,并且应在出现提示时响应 yes

OutputYou have requested to collect static files at the destination
location as specified in your settings.

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: 

然后你会看到更多的输出告诉你文件已被复制到 Spaces。

OutputCopying '/root/django-apps/mysite/mysite/static/css/app.css'

1 static file copied, 1 unmodified.

此时,如果您从 DigitalOcean Cloud 帐户返回存储桶,您将看到 cssimg 目录添加到您指向的文件夹中,其中 [X183X ] 在 css 目录中,DO-Logo_icon_blue-.png 图像在 img 目录中。

第 8 步 — 运行应用程序

如果您设置了 UFW 防火墙,我们首先通过发出以下命令允许入站流量通过端口 8000:

sudo ufw allow 8000

在您的虚拟环境仍然激活的情况下,让我们导航到 manage.py 文件的位置并使用以下命令运行应用程序:

cd ~/django-apps/mysite
python manage.py runserver <your-server-ip>:8000

在 Web 浏览器中,导航到 http://your-server-ip:8000 以查看您创建的 Django 应用程序的结果。 您将在浏览器中看到以下输出:

完成应用程序测试后,可以按 CTRL + C 停止 runserver 命令。 这将使您返回到您的编程环境。

当你准备好离开你的 Python 环境时,你可以运行 deactivate 命令:

deactivate

停用您的编程环境将使您回到终端命令提示符。

结论

在本教程中,您已成功创建了一个 Django 应用程序,该应用程序从 DigitalOcean Spaces 提供文件,同时从 Python 代码中抽象出 Spaces 凭据。 在此过程中,您了解了静态文件、如何管理静态文件、如何从云服务提供静态文件以及如何将配置参数与 python 设置文件解耦。

您可以通过阅读我们关于 Django Development 的教程系列继续学习使用 Python 和 Django 进行 Web 开发。