如何使用Django设置对象存储

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

介绍

DigitalOcean Spaces 是一种对象存储解决方案,非常适合存储音频、视频、图像或大量文本等非结构化数据。 要了解更多关于空间和对象存储的信息,您可以阅读DigitalOcean Spaces 简介

在本教程中,我们将介绍如何设置您的 Django 应用程序以使用 Spaces。

先决条件

为了开始本教程,您应该设置一些东西:

  • 在 Debian 或 Ubuntu 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

接下来,安装 pip 来管理 Python 的软件包:

sudo apt-get install -y python3-pip

最后,我们可以安装 virtualenv 模块,以便我们可以使用它来设置编程环境:

sudo pip3 install virtualenv

有关 programmig 环境的更多指导和信息,您可以阅读 设置虚拟环境

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

我们现在将继续创建将利用我们的 DigitalOcean Space 的 Django 应用程序。

在服务器的主目录中,运行以下命令来创建一个目录(在本例中,我们将其命名为 django-apps)来保存项目并导航到该目录:

mkdir django-apps
cd django-apps

在此目录中,使用以下命令创建一个虚拟环境。 我们将其称为 env,但您可以随意调用它。

virtualenv env

您现在可以激活环境,并通过命令行前缀的更改收到您在环境中的反馈。

. env/bin/activate

您将通过命令行前缀的更改收到您在环境中的反馈。 它看起来像这样,但会根据您所在的目录而改变:

  

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

pip install django

然后使用以下命令创建项目,在这种情况下,我们将其命名为 mysite

django-admin startproject mysite

接下来我们将安装 Boto 3,这是一个 AWS SDK for Python,它将允许我们的应用程序与 S3、EC2 和 DigitalOcean Spaces 等事物进行交互。 由于 DigitalOcean Spaces 可与 Amazon S3 互操作,因此 Spaces 可以轻松与 Boto 3 等工具进行交互。 有关 S3 和 Spaces 之间比较的更多详细信息,请查看 Spaces 文档

sudo pip install boto3

另一个对我们的项目至关重要的库是 django-storages,它是 Django 的自定义存储后端的集合。 我们还将使用 pip 安装它。

sudo pip install django-storages

您已经在 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

您将看到类似于以下内容的输出:

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'),
]

设置好这些文件后,我们可以继续编辑我们的 settings.py 文件,以便将其与对象存储集成。

第 5 步 — 更新设置

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

请记住,在此示例中,为了简洁起见,我们将对凭据进行硬编码,但这对于生产设置来说不够安全。 建议您使用 Python Decouple 之类的包来屏蔽您的 Spaces 凭据。 这个包将设置参数与你的源代码分开,这是生产级 Django 应用程序所必需的。

我们将首先导航到您的设置文件的位置。

cd ~/django-apps/mysite/mysite

使用 nano 打开文件进行编辑:

nano settings.py

将您的服务器 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 部分下方添加以下内容。 请务必添加您自己的访问密钥、存储桶名称和您希望文件存在的目录。 您可以通过浏览器中的 Spaces 界面添加目录。 在撰写本文时,NYC3 是 Spaces 当前所在的唯一区域,因此它作为端点 URL 传递。

设置.py

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

AWS_ACCESS_KEY_ID = 'your-spaces-access-key'
AWS_SECRET_ACCESS_KEY = 'your-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'

现在我们的设置文件已准备好将我们的 Django 应用程序与对象存储集成。

第 6 步 — 收集静态文件

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

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

cd ~/django-apps/mysite

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

python manage.py collectstatic

您将看到以下输出,并且在出现提示时应回复“是”。

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 目录中。

第 7 步 — 测试应用程序

一切都设置好并且我们的文件在我们的对象存储中,我们现在可以通过导航到提供静态文件的页面来测试我们的应用程序。

首先,让我们通过发出以下命令确保我们的防火墙允许流量通过端口 8000:

sudo ufw allow 8000

现在,我们可以通过引用我们服务器的 IP 地址并使用端口 8000 来运行我们的服务器。

python manage.py runserver your-server-ip:8000

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

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

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

deactivate

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

结论

在本教程中,您已成功创建了一个 Django 应用程序,该应用程序提供来自 DigitalOcean Spaces 的文件。 在此过程中,您了解了静态文件、如何管理静态文件以及如何从云服务中提供它们。

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