序章

Python Decouple は、開発者が構成設定をコードから簡単に分離できるようにすることを目的としたPythonライブラリです。 元々はDjango用に設計されていましたが、現在はパラメーターを格納し、コードとは別に定数値を定義するための汎用Pythonツールになっています。

このチュートリアルでは、Python Decoupleをインストールする方法と、DigitalOceanのオブジェクトストレージソリューションであるSpacesを利用する基本的なDjangoアプリケーションでPythonDecoupleを使用する方法について説明します。

前提条件

このチュートリアルの準備を適切に行うには、次のものが必要です。

  • UbuntuまたはDebianLinuxサーバーで設定されたsudo権限を持つ非rootユーザーアカウント。 これをまだ設定していない場合は、Ubuntu16.04またはDebianチュートリアルの初期サーバー設定に従ってください。
  • DigitalOceanSpaceと生成されたAPIキー。 これに関するガイダンスについては、このチュートリアルに従ってスペースを作成し、APIキーを設定できます。

サーバーの初期設定とDigitalOceanSpaceおよびAPIキーを使用して、開始する準備が整いました。

ステップ1—仮想環境をセットアップする

始める前に、まだ行っていない場合は、サーバーを更新およびアップグレードする良い機会です。

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

サーバーにはPython3が付属しているはずです。 次のコマンドを実行して、インストールされていることを確認します。

  1. sudo apt-get install python3

次に、Python用のパッケージマネージャーであるpipをインストールしましょう。

  1. sudo apt-get install -y python3-pip

最後に、 virtualenv モジュールをインストールして、プログラミング環境をセットアップできるようにする必要があります。

  1. sudo pip3 install virtualenv

プログラミング環境のセットアップと利用に関する詳細なガイダンスと情報については、仮想環境のセットアップに関するこのチュートリアルを確認してください。

これで、Pythonプログラミング環境に移行する準備が整いました。

ステップ2— Djangoアプリを作成し、依存関係をインストールする

次に、DigitalOceanSpacesとPythonDecoupleを利用するために、Djangoアプリを作成し、必要な依存関係をインストールする必要があります。

サーバーのホームディレクトリにいる間に、Djangoアプリケーションを含むディレクトリを作成する必要があります。 次のコマンドを実行して、django-appsまたは任意の別の名前のディレクトリを作成します。 次に、ディレクトリに移動します。

  1. mkdir django-apps
  2. cd django-apps

django-apps ディレクトリ内で、仮想環境を作成します。 それをenvと呼びましょう。

  1. virtualenv env

次に、次のコマンドを使用して仮想環境をアクティブ化します。

  1. . env/bin/activate

プレフィックスが(env)に変更されると、アクティブになっていることがわかります。これは、現在のディレクトリに応じて、次のようになります。

環境内で、pipを使用してDjangoパッケージをインストールします。 Djangoをインストールすると、Djangoアプリケーションを作成して実行できます。 Djangoの詳細については、 DjangoDevelopmentに関するチュートリアルシリーズをお読みください。

  1. pip install django

次に、次のコマンドを使用して、mysiteというDjangoプロジェクトを作成しましょう。

  1. django-admin startproject mysite

次に、AWS SDKforPythonであるBoto3 をインストールする必要があります。これにより、DigitalOceanSpacesなどのオブジェクトストレージソリューションをDjangoアプリケーションと統合できるようになります。

これを書いている時点では、Boto3はS3と明示的に互換性があります。 SpaceはS3と相互運用できるため、SpacesはBoto3とも互換性があります。 AmazonS3とDigitalOceanSpacesオブジェクトストレージの比較の詳細については、Spacesドキュメントをお読みください。

次のコマンドを実行して、Boto3をインストールします。

  1. pip install boto3

また、Djangoとboto3のカスタムストレージバックエンドのコレクションであるdjango-storagesをインストールする必要があります。

  1. pip install django-storages

最後に、PythonDecouple**をインストールしましょう。

  1. pip install python-decouple

Djangoアプリの環境内で依存関係を設定し、静的ディレクトリとテンプレートディレクトリを設定する準備が整いました。

ステップ3—ディレクトリとアセットを追加する

すべての依存関係が設定された環境で、mysite/mysiteディレクトリに切り替えることができます。

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

mysite/mysiteディレクトリ内で、次のコマンドを実行して静的ディレクトリとテンプレートディレクトリを作成します。

  1. mkdir static && mkdir templates

次に、staticディレクトリ内に存在する画像とCSSのサブディレクトリを作成します。

  1. mkdir static/img && mkdir static/css

ディレクトリを作成したら、テストファイルをダウンロードして、最終的にオブジェクトストレージに追加します。 イメージをダウンロードするので、imgディレクトリに切り替えます。

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

このディレクトリ内で、Wgetのwgetコマンドを使用してDigitalOceanロゴ画像をダウンロードします。 これは、Webサーバーからコンテンツを取得するためにUbuntuディストリビューションにプリインストールされている一般的に使用されるGNUプログラムです。

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

ENTERを押すと、次のような出力が表示されます。

Output
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を実行すると、DO_Logo_icon_blue.pngという名前のイメージがstatic/img/ディレクトリに存在することがわかります。

これらのディレクトリを設定し、保存する画像をサーバーにダウンロードしたら、Djangoアプリに関連付けられているファイルの編集に進むことができます。

ステップ4—CSSおよびHTMLファイルを編集する

まず、スタイルシートを編集します。 cssディレクトリに移動して、Webアプリの基本的なスタイルシートを追加できるようにする必要があります。

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

ドキュメントを編集するには、nanoまたは選択した別のテキストエディタを使用します。

  1. 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ディレクトリに移動します。

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

home.htmlというファイルを開き、そのファイルにHTMLを追加して、基本的なWebアプリを表示する必要があります。 nanoを使用してファイルを開き、編集できるようにします。

  1. 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ファイルを指します。 次のディレクトリに移動する必要があります。

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

nanoを使用してurls.pyファイルを編集します。

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

これらのファイルを設定したら、次に、オブジェクトストレージと統合するための設定の構成に取り掛かることができます。

ステップ5—Pythonデカップリングを使用してスペースクレデンシャルを抽象化する

仮想環境内で、settings.pyファイルの場所に移動します。 ここで、settings.iniファイルを作成して、資格情報を個別に保存します。

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

settings.iniファイルを作成するには、touchを使用します。これは、呼び出し元のディレクトリに新しい空のファイルを作成するLinuxコマンドです。

  1. touch settings.ini

作成される設定ファイルのファイル拡張子は.iniになります。 このファイルは、Python Decoupleによって設定データとして参照されます。また、設定ファイルがAPIキーを参照する場所でもあります。 .iniの代わりに.envを使用することもできます。

次に、nanoなどのお気に入りのテキストエディタを使用して、settings.iniファイルを開きます。

  1. nano settings.ini

このドキュメントでは、PythonDecoupleに必要なセクションヘッダー[settings]を用意し、変数に割り当てることでSpacesのクレデンシャルを追加します。 完全なファイルは次のようになります。

settings.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のクレデンシャルで更新して、画像を表示するために設定したページを利用できるようにします。

設定ファイルにアクセスするための正しい場所にいることを確認してください。

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

nanoまたは別のテキストエディタで編集するためにファイルを開きます。

  1. nano settings.py

Decoupleの構成モジュールを使用するには、ファイルの先頭にimportステートメントを追加する必要があります。

settings.py
...
import os
from decouple import config
...

ファイル内で許可されたホストに移動し、サーバー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セクションの下に以下を追加します。 最初の2行は、 settings.ini ファイルへの参照を追加して、構成パラメーターを取得できるようにします。

その下に、必ず独自のバケット名を追加してください。 執筆時点では、NYC3はSpacesが現在存在する唯一のリージョンであるため、エンドポイントURLとして渡されています。

ターミナルの場所として、ファイルをインポートするディレクトリを追加します。 Spacesインターフェイスのブラウザ内からディレクトリを追加できます。

settings.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/に移動しましょう。

  1. cd ~/django-apps/mysite

ディレクトリ内で、次のコマンドを実行します。

  1. python manage.py collectstatic

次の出力が表示され、プロンプトが表示されたらyesと応答するはずです。

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

次に、ファイルがSpacesにコピーされたことを示す出力がさらに表示されます。

Output
Copying '/root/django-apps/mysite/mysite/static/css/app.css' 1 static file copied, 1 unmodified.

この時点で、DigitalOcean Cloudアカウントからバケットに戻ると、cssおよびimgディレクトリが、app.cssとともに指定したフォルダーに追加されていることがわかります。 ]はcssディレクトリにあり、DO-Logo_icon_blue-.pngイメージはimgディレクトリにあります。

ステップ8—アプリケーションを実行する

UFWファイアウォールを設定している場合は、最初に次のコマンドを発行して、インバウンドトラフィックがポート8000を通過できるようにします。

  1. sudo ufw allow 8000

仮想環境をアクティブにしたまま、 manage.py ファイルの場所に移動し、次のコマンドを使用してアプリケーションを実行します。

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

Webブラウザーで、http:// your-server-ip :8000に移動して、作成したDjangoアプリケーションの結果を確認します。 ブラウザに次の出力が表示されます。

DigitalOcean Spaces Django and Python Decouple Example App

アプリのテストが終了したら、CTRL + Cを押して、runserverコマンドを停止できます。 これにより、プログラミング環境に戻ります。

Python環境を終了する準備ができたら、deactivateコマンドを実行できます。

  1. deactivate

プログラミング環境を非アクティブ化すると、ターミナルコマンドプロンプトに戻ります。

結論

このチュートリアルでは、PythonコードからSpacesのクレデンシャルを抽象化しながら、DigitalOceanSpacesからファイルを提供するDjangoアプリケーションを正常に作成しました。 このプロセスでは、静的ファイル、静的ファイルを管理する方法、クラウドサービスから静的ファイルを提供する方法、およびPython設定ファイルから構成パラメーターを分離する方法について学習しました。

Django Development のチュートリアルシリーズを読むことで、PythonとDjangoを使用したWeb開発について引き続き学習できます。