介绍
Python Decouple是一个Python库,旨在使开发人员能够更轻松地将其配置设置从代码中分离出来。 最初是为Django设计的,现在它是一个通用的Python工具,用于存储参数并定义与代码分离的常量值。
在本教程中,我们将介绍如何安装Python Decouple,以及如何在基于Django的应用程序中使用DigitalOcean的对象存储解决方案Spaces。
先决条件
为了充分准备本教程,您将需要以下内容:
- 具有在Ubuntu或Debian Linux服务器上设置的
sudo
权限的非root用户帐户。 如果您尚未设置,请遵循Ubuntu 16.04或Debian教程的初始服务器设置 。 - 一个DigitalOcean空间和一个生成的API密钥。 有关这方面的指导,您可以按照本教程创建一个空间并设置API密钥 。
使用初始的服务器设置和DigitalOcean Space和API密钥,即可开始使用。
第1步 - 设置虚拟环境
在开始之前,如果您还没有这样做,现在是更新和升级服务器的好时机。
sudo apt-get update && sudo apt-get -y upgrade
您的服务器应该已经附带了Python 3.运行以下命令以验证它是否已安装:
sudo apt-get install python3
接下来,让我们安装Python的包管理器。
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
接下来,我们需要安装适用于Python的AWS开发工具包Boto 3 ,这将允许我们将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://www.youcl.com/uploads/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
命令,则会注意到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:
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
在文档中添加以下内容:
{% 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
您可以删除文件中的所有内容,然后添加以下内容:
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
在这个文档中,我们将有一个Python Decouple所需的节头, [settings]
,并将它们分配给变量来添加Spaces凭证。 您的完整文件应该如下所示:
[settings]
SPACES_ACCESS_KEY=your-spaces-access-key
SPACES_SECRET_ACCESS_KEY=your-spaces-secret-access-key
为了访问这些凭证,我们需要参考settings.ini
文件中的settings.py
文件。
在下一步中,我们将完整地配置settings.py
文件。
第6步 - 更新设置
现在是时候用Spaces证书更新设置文件,以便我们可以利用我们设置的页面来显示图像。
确保您位于正确的位置以访问您的设置文件。
cd ~/django-apps/mysite/mysite
用nano或其他文本编辑器打开文件进行编辑:
nano settings.py
在文件顶部,我们需要添加一个import
语句 ,以便使用Decouple中的配置模块。
...
import os
from decouple import config
...
在文件中向下移动到允许的主机并添加您的服务器IP。
...
ALLOWED_HOSTS = ['your-server-ip']
...
然后将storages
添加到设置文件的已安装的应用程序部分,并删除django.contrib.admin
因为我们不会在本教程中使用它。 它应该如下所示。
...
# Application definition
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'storages'
]
...
将高亮显示的文本替换并添加到设置文件的“ TEMPLATES
部分,以便项目知道在哪里找到您的home.html
文件。
...
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是当前空间的唯一区域,因此将作为端点URL传递。
对于终端位置,添加您想要导入文件的目录。 您可以通过浏览器中的空间界面添加一个目录。
...
# 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代码中提取了空间凭证,我们的设置文件已经准备好将我们的Django应用程序与对象存储集成在一起。
让我们运行Django Web应用程序来验证一切已经正确设置。
第7步 - 收集静态文件
现在我们运行collectstatic
,您会注意到正在传输的文件,包括我们保存在静态目录中的图像。 它将被转移到我们在设置文件中确定的Spaces位置。
为了达到这个目的,我们导航到~/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:
然后你会看到更多的输出,告诉你这个文件已经被复制到空间。
OutputCopying '/root/django-apps/mysite/mysite/static/css/app.css'
1 static file copied, 1 unmodified.
此时,如果您从DigitalOcean Cloud帐户返回存储分区,则会看到添加到您指向的文件夹的css
和img
目录,以及css
目录中DO-Logo_icon_blue-.png
和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代码中抽取空间凭证。 在这个过程中,您已经了解了静态文件,如何管理静态文件,如何从云服务提供服务,以及如何从python设置文件中分离配置参数。
通过阅读我们关于Django开发的系列教程,您可以继续使用Python和Django学习Web开发。