render.comで初めてのDjangoアプリをデプロイ

こんにちは。就職支援校でpython webエンジニア養成コースを受講している者です。
授業ではDjangoというフレームワークを使ってWebアプリを作ったんですが、自分の作ったアプリをデプロイする方法までは教えてくれませんでした。
でもアプリが実際に動いているところが見たい!と思ったのでいろいろ調べてやってみました。なかなか苦労した(三時間以上かかった)ので、つまづいた所をメモしておきます。

開発環境

Windows 11
Python 3.11.4
Django 4.2.4

事前準備

仮想環境を設定しよう

デプロイ先と環境を合わせるためには、使用するモジュールのリストであるrequirements.txtが欠かせません。手書きすることも無理ではないですが、仮想環境を作ってpip freezeした方が断然効率的です。python標準のvenvを使いましたが、詳しい方法は割愛。

参考リンク: https://camp.trainocate.co.jp/magazine/venv-python/

環境変数ファイルを用意しよう

Djangoが用意してくれるsettings.pyにはSECRET_KEY(秘密のパスワードみたいなもの)が直接書かれています。ソースコードを公開しないならそのままでもいいかもしれませんが、他人に見られてしまうとまずい(らしい)。
django-environというモジュールが使えるらしいのでインストールします。

pip install django-environ

.envというファイルをプロジェクトのルート(manage.pyと同じフォルダ)に作り、内容を書き込みます。SECRET_KEYの値にはsettings.pyと同じものを書き込みます。
イコールの前後に半角スペースが入っているとエラーが出るので注意。あとシングルクォーテーションを外すのを忘れずに。

# Djangoの秘密鍵
SECRET_KEY=django-insecure-(ここに英数字の羅列が入る)
# デバッグモード
DEBUG=False

settings.pyを書き換えて、.envの内容を変数に読み込みます。

from pathlib import Path
import os
import environ

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env('DEBUG')

.gitignoreを設定しよう

gitでバージョン管理したくないファイルを設定しましょう。
ルートに.gitignoreというファイルを作って内容を書き込みます。
仮想環境のフォルダ、一時ファイル、.envファイルは最低限必要ですね。
他にもGithubに送れない大きなファイルが含まれるなら、拡張子ごと除外しておくのが得策です。

.venv/
*.pyc
*/__pycache__/
.env
db.sqlite3

Githubにプッシュしよう

準備ができたらプロジェクトをコミットしてプッシュしましょう。VSCodeのGitLensという拡張機能を使うとめちゃ楽です。

いざデプロイ!と思ったが…

ここからは https://zenn.dev/hathle/books/django-render-book  を読みながら準備を進めていきました。まず推奨モジュールのインストール。pip freezeでrequirements.txtを更新しておくのも忘れずに。

アプリ自体は完成していたので、2章から8章に飛びます。MIDDLEWAREにwhitenoiseを追加して、SUPERUSERの情報を.envに追加。DBMSを環境変数DATABASE_URLから読み込むように。superuserコマンドを設定。この辺りはほぼコピペするだけなので解説しません。

build.shとrender.yamlの設定

この二つのファイルはrender.comのサーバーに、デプロイ時に実行するコマンドを指定するためのものです。build.shはコピペでOK。render.yamlは少しだけ書き換えます。

databases:
  - name: django_render_db
    region: singapore
    plan: free
    databaseName: django_render_db
    user: django_user

services:
  - type: web
    name: (ここに好きなサービス名を入れる)
    env: python
    region: singapore
    buildCommand: './build.sh'
    startCommand: 'gunicorn (ここに自分のプロジェクト名を入れる).wsgi:application'
    plan: free
    branch: main(Github上のブランチ名。人によってはmasterかも)
    healthCheckPath: /
    envVars:
      - key: DATABASE_URL
        fromDatabase:
          name: django_render_db
          property: connectionString
      - key: SECRET_KEY
        generateValue: true
      - key: WEB_CONCURRENCY
        value: 4
    autoDeploy: true

render.comにプロジェクトを登録

blueprintから対象のプロジェクトにconnectをしてサービスを立ち上げます。サービスの設定画面を開いて Enviroment > Secret files から.envファイルの中身を設定したら、最低限動かす準備はできました。・・・運が良ければ。

エラーが次々出る!

ビルド失敗😞 無慈悲な顔文字に最初のジャブをくらいます。

Sep 22 10:31:36 AM  ERROR: Could not find a version that satisfies the requirement numpy==1.25.2 (from versions: 1.3.0, 1.4.1, (中略), 1.24.4)
Sep 22 10:31:36 AM  ERROR: No matching distribution found for numpy==1.25.2

なぜかrender.comでは最新verのnumpyがインストールできないらしいので、numpyをバージョンダウンします。

pip install numpy==1.24.4
pip freeze > requirements.txt

pythonバージョン違い問題

render.comで使われているpythonのバージョンは3.7。タイプ注釈など新しい文法がコードに含まれているとぼろぼろエラーが出ます。

Sep 22 10:36:14 AM      def percent(self) -> float | None:
Sep 22 10:36:14 AM  TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'
Sep 22 10:36:14 AM  ==> Build failed 😞

最初は見つかるごとに手作業で消していたのですが、らちがあかないのでお掃除を決行。Ctrl+Shift+Fでファイル横断検索ができるのでちゃっちゃと消していきます。

他にもいろいろ

settings.pyのSTATIC_ROOTの設定し忘れとか、ALLOWED_HOSTSの設定忘れとか、細かいトラブルはあったものの、エラーメッセージを根気よく読んで対応していったらデプロイできました!
コミット履歴を見返したら18回ぐらいやり直してました。

終わりに

自分の作ったアプリが実際にインターネット上で表示されるのは中々楽しいです。
PythonもDjangoも無料でインストールできるし、render.comも基本料金無料なので、根気とやる気さえあれば誰でも0円でWebアプリを開発できます。すごい時代ですね。
少しでも皆さんの参考になれば幸いです。

作ったWebアプリはこちら

この記事が気に入ったらサポートをしてみませんか?