如何使用Django设置对象存储

DigitalOcean Spaces是一款对象存储解决方案,非常适合非结构化数据,如音频,视频,图像或大量文本。要了解有关空间和对象存储的更多信息,请阅读[DigitalOcean简介...

介绍

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

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

先决条件

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

随着初始服务器的设置和DigitalOcean空间和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空间的Django应用程序。

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

mkdir django-apps
cd django-apps

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

virtualenv env

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

. env/bin/activate

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


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

pip install django

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

django-admin startproject mysite

接下来,我们将安装Boto 3,这是一个适用于PythonAWS开发工具包 ,可让我们的应用程序与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 http://www.howtoing.com/wp-content/uploads/logos/DO_Logo_icon_blue.png

你会看到类似于以下的输出:

Resolving 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命令,则会注意到static/img/目录中存在名为DO_Logo_icon_blue.png的映像。

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

第4步 - 编辑CSS和HTML文件

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

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

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

nano app.css

一旦文件打开,添加下面的CSS:

app.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

在文档中添加以下内容:

home.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

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

urls.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这样的软件包去耦合类似于屏蔽Spaces证书的东西。 这个软件包将分离源代码中的设置参数,这是生产级Django应用程序所必需的。

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

cd ~/django-apps/mysite/mysite

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

nano settings.py

添加你的服务器IP作为一个允许的主机。

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

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

settings.py
...
# Application definition

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

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

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

settings.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 ,您会注意到正在传输的文件,包括我们保存在静态目录中的图像。 它将被转移到我们在设置文件中确定的Spaces位置。

为了达到这个目的,我们导航到~/django-apps/mysite/

cd ~/django-apps/mysite

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

python3 manage.py collectstatic

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

You 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: 

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

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

1 static file copied, 1 unmodified.

此时,如果您从DigitalOcean Cloud帐户返回存储分区,则会看到添加到您指向的文件夹的cssimg目录,以及css目录中DO-Logo_icon_blue-.pngDO-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应用程序的结果。 您将在浏览器中看到以下输出:

DigitalOcean Spaces Django示例应用程序

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

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

deactivate

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

结论

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

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


分享按钮