Django

【Django×pipenv】GAEにデプロイする方法

Djangoプロジェクトを作成する

DjangoをGAEにデプロイする公式サイトは以下のリンクです。

公式サイト

Djangoのプロジェクト作成に関しては、以下の記事で紹介しています。

PipenvとDjangoでの最適なディレクトリ構造

ただプロジェクトを作成するだけでなく、データベース設定などは環境ごとに分割するための手順なども紹介しているので、ぜひ読んでみてください!

GCPのプロジェクトを作成する

gcloud-sdkのインストール

プロジェクトの作成

必要なファイルを用意する

app.yamlを作成

このファイルには、プロジェクトを本番環境にデプロイした際に、

・何をエントリーポイントにするか、
・どのURLからのアクセスを有効にするか、

などの設定を記述すると思ってください。

以下のリンクが書き方の公式ページになっているので、参考にしながら進めてください。
Python3 ランタイム環境

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

handlers:
- url: .*
  script: auto

ここで、gunicornというライブラリが必要なので、インストールします。

$ pipenv install gunicorn

requirements.txtを生成

現段階では、GAEはPipfileに対応してないので以下のコマンドで、
Pipfileからrequirements.txtを生成します。

requirements.txtとは、これに書かれているライブラリが本番環境でインストールされます。
必要なものをインストールしてくださいね、っていう命令をするためのファイルだと思ってください。

$ pipenv lock -r > requirements.txt

.gcloudignoreを作成

また、PipfileをGAEにデプロイした際に一緒にあげてしまわないように、
.gcloudignoreというファイルをプロジェクト直下に作成し、以下のように記述してください。

コピペで大丈夫です。

# This file specifies files that are *not* uploaded to Google Cloud Platform
# using gcloud. It follows the same syntax as .gitignore, with the addition of
# "#!include" directives (which insert the entries of the given .gitignore-style
# file at that point).
#
# For more information, run:
#   $ gcloud topic gcloudignore
#
.gcloudignore
# If you would like to upload your .git directory, .gitignore file or files
# from your .gitignore file, remove the corresponding line
# below:
.git
.gitignore

# Python pycache:
__pycache__/
# Ignored by the build system
/setup.cfg

Pipfile
Pipfile.lock

ホストを許可

ALLOWED_HOSTS = ['*']

デプロイする

デプロイ

$ gcloud auth login

自分のプロジェクトをアップロード(デプロイ)します。

プロジェクトIDは、Google Cloud Platformから確認できます。

すると、以下のように表示されるので、2を入力します。

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:

続いて、以下ではYを入力します。

Do you want to continue (Y/n)?

少し時間がかかりますが、うまくいけばデプロイ完了です。

ブラウザで表示

ブラウザで表示してみましょう。

$ gcloud app browse –project=[プロジェクトID]

ログの確認

もし、エラーが出た場合は、以下のコマンドでログを確認してみましょう。

$ gcloud app logs tail –project=[プロジェクトID]

Cloud MySQLと連携する

以下の公式ページを参考に進めます、適宜こちらも確認して下さい。
Cloud SQL Proxy

MySQLクライアントに接続する

Cloud SQL APIを有効にする

プロキシをインストールする

$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64

$ chmod +x cloud_sql_proxy

プロキシを開始する

$ ./cloud_sql_proxy -instances=[インスタンス接続名]=tcp:3306

2019/12/29 16:36:22 Listening on 127.0.0.1:3306 for [インスタンス接続名]
2019/12/29 16:36:22 Ready for new connections

上記のように表示されれば、接続完了です。

ん?これで何ができるようになっているのか??

簡単にいうと、ローカル環境とCloud SQLをつなぐことができました。
つまり、ローカルからCloud SQLを操作できる環境が整った、ということです。

ローカルからCloud SQLに接続する

Cloud MySQLを起動します。その際、ユーザー名とパスワード(任意)が必要なので、まずは作成します。

ターミナルをもう1つ開いて、以下のコマンドで接続します。

$ mysql -u [ユーザー名] -p –host 127.0.0.1

ローカルからCloud SQLにマイグレーションを実行

$ pipenv run python3 manage.py migrate --settings=config.settings.production

GAE用の設定

App Engine スタンダード環境での Django の実行

# GAEからのアクセスの場合(本番)

if os.getenv('GAE_APPLICATION', None):

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'データベース名',
            'USER': 'ユーザー名',
            'PASSWORD': 'パスワード',
            'HOST': '/cloudsql/プロジェクトID'
        }
    }

staticファイルを扱う

settingsの編集

一般的にローカルで開発する際の記述。

# staticディレクトリの場所
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, '../static')
]

これは、ローカルでの記述なので、develop.pyに映してあげます。
base.pyの記述は削除しましょう。

develop.py

# staticディレクトリの場所
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, '../static')
]

production.py

# staticディレクトリの場所
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, '../static')
]

app.yaml

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

handlers:
- url: /static # 一番上に追加
  static_dir: static/
- url: .*
  script: auto

CSSファイルの作成

プロジェクト直下に、

static/css/style.cssのように作成しましょう。

h1{
    color: red;
}

HTMLに反映


{% load static %} <!-- 追加 -->
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="{% static 'css/style.css' %}"> <!-- 追加 -->
    <title>シフト管理</title>
</head>

<body>
    <h1>トップページ</h1>
</body>

</html>

COMMENT

メールアドレスが公開されることはありません。