Django2.2をGAEにデプロイ

概要

本記事はDjangoアプリをGAEにデプロイするため必要なファイルや設定を解説していきます。

バージョンは以下の通りです。

  • OS: Mac
  • Python: 3.7.3
  • pip: 19.2.3
  • Django: 2.2.5

前提

以下、前準備として必要最低限揃っている前提です。

  • Djangoプロジェクトは作成済み
  • GAEやGCP自体の説明は割愛
  • GCPのプロジェクトを作る前までは完了している。 (ユーザやクレジットカードは登録済み)

GCP側の準備

GCPプロジェクトの作成

まず始めにデプロイ先であるGCP上にプロジェクトを作成していきます。

本記事では gae-django という名前で作成し、

個人なので、場所は「組織なし」で問題ありません。

Cloud SDKのインストール

クライアントPCからGCPにデプロイするために、Cloud SDKが必要です。 下記のサイトでインストールしましょう。

Cloud SDKのインストール

Cloud Build APIを有効にする

GCPのサービスを使う上でCloud Build APIを有効にする設定が必要になります。

ダッシュボードの検索欄に「Cloud Build API」と入力し、

検索結果画面で「有効」ボタンを押下します。

Djangoプロジェクト

次はDjango側の設定に移りますが、その前に 今回デプロイするDjangoアプリを紹介します。

デプロイが目的なので、細かな説明は割愛します。

構成

今回は以下の機能を持つシンプルな掲示板アプリを作りました。

  • 投稿記事一覧
  • 投稿記事作成
.
├── Pipfile
├── Pipfile.lock
└── gae_django
    ├── board
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── forms.py
    │   ├── migrations
    │   │   ├── 0001_initial.py
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   ├── urls.py
    │   └── views.py
    ├── db.sqlite3
    ├── gae_django
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── manage.py
    ├── static
    │   └── board
    │       └── css
    │           └── style.css
    └── templates
        ├── base.html
        └── board
            ├── post_create.html
            └── post_list.html

アプリの見た目

① 投稿記事一覧画面

② 投稿記事作成画面

アプリのソースコード

・urls.py

from django.urls import path

from board.views import PostCreateView, PostListView


app_name = 'board'


urlpatterns = [
    path('', PostListView.as_view(), name='index'),
    path('create/', PostCreateView.as_view(), name='create'),
]

・ models.py

from django.db import models
from django.urls import reverse


class Post(models.Model):
    title = models.CharField(max_length=255, blank=False)
    detail = models.TextField(blank=False)

    def get_absolute_url(self):
        return reverse('board:index')

・ views.py

from django.views import generic

from board.forms import PostForm
from board.models import Post


class PostListView(generic.ListView):
    template_name = 'board/post_list.html'
    model = Post
    context_object_name = 'posts'


class PostCreateView(generic.CreateView):
    template_name = 'board/post_create.html'
    model = Post
    form_class = PostForm

・ forms.py

from django import forms

from board.models import Post


class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('title', 'detail')

GAEにデプロイ

次に上記のアプリをGAEにデプロイするための準備を行います。

app.yaml

GAE側にどの言語でどこをエンドポイントで動かすのかなどを 教えるためのファイルを作成します。 Djangoプロジェクトの直下に作成しましょう。

runtime: python37
entrypoint: gunicorn -b :$PORT gae_django.wsgi:application

handlers:
    - url: /static
      static_dir: staticfiles/
    - url: .*
      script: auto

gunicornを使っているのでインストールをします。

pipenv install gunicorn

requirements.txt

GAEは言語にPythonを使っている場合に、requirements.txtを探し出し、パッケージをインストールしてくれます。 これもDjangoプロジェクトの直下に作成しましょう。

pipenv lock -r > requirements.txt

settings.py

settings.pyにGAE上で動かすための設定を加えていきます。

ALLOWED_HOSTS = ['*']

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

デプロイ確認

先にstaticファイルを1箇所にまとめておきましょう。

pipenv run python manage.py collectstatic

ここまで準備したらGAE上にデプロイしてみましょう。 次のコマンドを打ってブラウザにアクセスしてみます。

gcloud app deploy --project=gae-django-253212

リージョンを聞かれるので、asia-northeast1を選びましょう。

Please choose the region where you want your App Engine application 
located:

 [1] asia-east2    (supports standard and flexible)
 [2] asia-northeast1 (supports standard and flexible)
 [3] asia-northeast2 (supports standard and flexible)
 [4] asia-south1   (supports standard and flexible)
 [5] australia-southeast1 (supports standard and flexible)
 [6] europe-west   (supports standard and flexible)
 [7] europe-west2  (supports standard and flexible)
 [8] europe-west3  (supports standard and flexible)
 [9] europe-west6  (supports standard and flexible)
 [10] northamerica-northeast1 (supports standard and flexible)
 [11] southamerica-east1 (supports standard and flexible)
 [12] us-central    (supports standard and flexible)
 [13] us-east1      (supports standard and flexible)
 [14] us-east4      (supports standard and flexible)
 [15] us-west2      (supports standard and flexible)
 [16] cancel
Please enter your numeric choice:  2

「Do you want to continue」と聞かれたらYを入力。

下記のメッセージが表示されたらデプロイ完了です。

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 1 file to Google Cloud Storage                 ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.                                                                                                                           
Setting traffic split for service [default]...done.                                                                                                          
Deployed service [default] to [https://gae-django-253212.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse --project=gae-django-253212

実施にブラウザで確認してみましょう。

gcloud app browse --project=gae-django-253212

無事にデプロイできました。

次はCloud SQLを使ったデータベースの設定を行って行きます。

Django2.2をGAE, Cloud SQL環境にデプロイ