如何使用 Django 设置对象存储

介绍

DigitalOcean Spaces 是一个对象存储解决方案,适用于非结构化数据,如音频、视频、图像或大量文本. 有关空间和对象存储的更多信息,请参阅 An Introduction to DigitalOcean Spaces

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

前提条件

为了开始这个教程,你应该有几个东西设置:

  • 在 Debian 或 Ubuntu Linux 服务器上设置了sudo特权的非根用户帐户. 如果您尚未设置此功能,请遵循 Ubuntu 16.04 初始服务器设置Debian教程
  • 此外,您应该创建一个 DigitalOcean Space 并生成一个 API 密钥。

有了初始服务器设置和DigitalOcean空间和API密钥,您已经准备好开始。

步骤1:创建虚拟环境

如果你还没有,先更新和升级你的服务器。

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

您的服务器应该使用 Python 3 发送,但您可以运行以下命令来确保它已安装:

1sudo apt-get install python3

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

1sudo apt-get install -y python3-pip

最后,我们可以安装 virtualenv模块,这样我们就可以使用它来设置一个编程环境:

1sudo pip3 install virtualenv

有关程序环境的进一步指导和信息,您可以阅读关于 设置虚拟环境

步骤 2 — 创建 Django 应用程序并安装依赖

我们现在将继续创建Django应用程序,该应用程序将利用我们的DigitalOcean空间。

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

1mkdir django-apps
2cd django-apps

在此目录中,使用以下命令创建一个虚拟环境,我们将称之为env,但您可以将其称为任何您想要的环境。

1virtualenv env

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

1. env/bin/activate

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

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

1pip install django

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

1django-admin startproject mysite

接下来,我们将安装 Boto 3,这是一个 AWS SDK for Python,它将允许我们的应用程序与诸如 S3, EC2 和 DigitalOcean Spaces 进行交互。

1sudo pip install boto3

另一个对我们的项目至关重要的库是django-storages,这是Django的自定义存储后端集(https://django-storages.readthedocs.io/en/latest/)。

1sudo pip install django-storages

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

步骤 3 – 添加目录和资产

随着我们的环境设置了所有依赖性,您现在可以切换到mysite/mysite目录,

1cd ~/django-apps/mysite/mysite

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

1mkdir static && mkdir templates

接下来,我们将创建图像和CSS的子目录,以在静态目录中生活。

1mkdir static/img && mkdir static/css

一旦您创建了目录,我们将下载一个测试文件,我们最终将其添加到我们的对象存储中。

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

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

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

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

 1[secondary_label Output]
 2Resolving www.digitalocean.com (www.digitalocean.com)... 104.16.24.4, 104.16.25.4
 3Connecting to www.digitalocean.com (www.digitalocean.com)|104.16.24.4|:443... connected.
 4HTTP request sent, awaiting response... 200 OK
 5Length: 1283 (1.3K) [image/png]
 6Saving to: ‘DO_Logo_icon_blue.png’
 7
 8DO_Logo_icon_blue-6edd7377 100%[=====================================>]   1.25K  --.-KB/s in 0s      
 9
102017-11-05 12:26:24 (9.60 MB/s) - ‘DO_Logo_icon_blue.png’ saved [1283/1283]

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

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

步骤 4 – 编辑 CSS 和 HTML 文件

您应该进入css目录,以便我们可以为我们的Web应用添加一个基本的样式。

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

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

1nano app.css

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

 1[label app.css]
 2body {
 3  margin: 0;
 4  background-color: #f1f1f1;
 5  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
 6}
 7
 8.container {
 9  width: 80%;
10  border: 1px solid #ddd;
11  background-color: #fff;
12  padding: 20px;
13  margin: 40px auto;
14}
15
16form {
17  margin-bottom: 20px;
18  padding: 10px;
19  border: 1px solid #ff9900;
20  width: 350px;
21}
22
23table {
24  border-collapse: collapse;
25  width: 100%;
26}
27
28table td,
29table th {
30  border: 1px solid #eceeef;
31  padding: 5px 8px;
32  text-align: left;
33}
34
35table thead {
36  border-bottom: 2px solid #eceeef;
37}

一旦完成,你可以保存和关闭文件. 从这里,导航到模板目录。

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

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

1nano home.html

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

 1[label home.html]
 2{% load static %}
 3<!DOCTYPE html>
 4<html>
 5<head>
 6  <meta charset="utf-8">
 7  <title>Spaces + Django Tutorial</title>
 8  <link rel="stylesheet" type="text/css" href="{% static 'css/app.css' %}">
 9</head>
10<body>
11  <center>
12  <header>
13    <h1>Spaces + Django Tutorial</h1>
14  </header>
15  <main>
16    <img src="{% static 'img/DO_Logo_icon_blue.png' %}">
17    <h2>Congratulations, you’re using Spaces!</h2>
18  </main>
19  </center>
20</body>
21</html>

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

1cd ~/django-apps/mysite/mysite

使用 nano 编辑 urls.py 文件。

1nano urls.py

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

1[label urls.py]
2from django.conf.urls import url
3from django.views.generic import TemplateView
4
5urlpatterns = [
6    url(r'^$', TemplateView.as_view(template_name='home.html'), name='home'),
7]

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

步骤 5 – 更新设置

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

请记住,在本示例中,我们将为简短编码我们的凭证,但这对于生产设置是不够安全的。建议您使用一个包,如 **Python Decouple**某种方式来掩盖您的空间凭证。

我们将开始通过导航到您的设置文件的位置。

1cd ~/django-apps/mysite/mysite

打开文件以编辑,使用nano:

1nano settings.py

添加您的服务器IP作为允许主机。

1[label settings.py]
2...
3ALLOWED_HOSTS = ['your-server-ip']
4...

然后在设置文件的安装应用程序部分添加存储并删除django.contrib.admin,因为我们不会在本教程中使用它。

 1[label settings.py]
 2...
 3# Application definition
 4
 5INSTALLED_APPS = [
 6    'django.contrib.auth',
 7    'django.contrib.contenttypes',
 8    'django.contrib.sessions',
 9    'django.contrib.messages',
10    'django.contrib.staticfiles',
11    'storages'
12]
13...

更换并将突出列出的文本添加到设置文件的TEMPLATES部分,以便项目知道您的 home.html 文件的位置。

 1[label settings.py]
 2...
 3TEMPLATES = [
 4    {
 5        'BACKEND': 'django.template.backends.django.DjangoTemplates',
 6        'DIRS': [os.path.join(BASE_DIR, 'mysite/templates')],
 7        'APP_DIRS': True,
 8        'OPTIONS': {
 9            'context_processors': [
10                'django.template.context_processors.debug',
11                'django.template.context_processors.request',
12                'django.contrib.auth.context_processors.auth',
13                'django.contrib.messages.context_processors.messages',
14            ],
15        },
16    },
17]
18...

最后,让我们在文件底部更新您的设置。我们将在#静态文件部分下方添加以下内容。 请确保添加自己的访问密钥、桶名和您希望您的文件存活的目录。 您可以通过浏览器中的Spaces接口添加目录。 在写作时,NYC3是目前Spaces唯一的区域,所以它正在作为端点URL传递。

 1[label settings.py]
 2...
 3# Static files (CSS, JavaScript, Images)
 4# https://docs.djangoproject.com/en/1.11/howto/static-files/
 5
 6AWS_ACCESS_KEY_ID = 'your-spaces-access-key'
 7AWS_SECRET_ACCESS_KEY = 'your-spaces-secret-access-key'
 8AWS_STORAGE_BUCKET_NAME = 'your-storage-bucket-name'
 9AWS_S3_ENDPOINT_URL = 'https://nyc3.digitaloceanspaces.com'
10AWS_S3_OBJECT_PARAMETERS = {
11    'CacheControl': 'max-age=86400',
12}
13AWS_LOCATION = 'your-spaces-files-folder'
14
15STATICFILES_DIRS = [
16    os.path.join(BASE_DIR, 'mysite/static'),
17]
18STATIC_URL = 'https://%s/%s/' % (AWS_S3_ENDPOINT_URL, AWS_LOCATION)
19STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

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

步骤 6 – 收集静态文件

现在我们将运行collectstatic,你会注意到正在传输的文件,包括我们在我们的静态目录中保存的图像。

要做到这一点,让我们导航到 ~/django-apps/mysite/ :

1cd ~/django-apps/mysite

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

1python manage.py collectstatic

您将看到以下输出,并应在提示时回答是。

1[secondary_label Output]
2You have requested to collect static files at the destination
3location as specified in your settings.
4
5This will overwrite existing files!
6Are you sure you want to do this?
7
8Type 'yes' to continue, or 'no' to cancel:

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

1[secondary_label Output]
2Copying '/root/django-apps/mysite/mysite/static/css/app.css'
3
41 static file copied, 1 unmodified.

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

步骤7:测试应用程序

有了所有设置和我们的文件在我们的对象存储,我们现在可以通过导航到我们的静态文件正在服务的页面来测试我们的应用程序。

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

1sudo ufw allow 8000

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

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

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

DigitalOcean Spaces Django Example App

当你完成测试你的应用程序时,你可以按CTRL +C停止runserver命令,这会让你回到你的编程环境。

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

1deactivate

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

结论

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

您可以通过阅读我们在 [Django Development] 上的教程系列继续学习 Python 和 Django 的 Web 开发(https://www.digitalocean.com/community/tutorial_series/django-development)。

Published At
Categories with 技术
comments powered by Disqus