【Django入門】Render(無料プラン)のQuickstartsをWindows11でやってみる

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約14分で読めます。
広告

RenderのQuickstarts/DjangoをpipとWindows11でやってみました。初心者は公式が書いてるやり方以外は、やらない方がいいと思います。しかし今回、私の環境では公式通りの手順でできないため、ご紹介するような形になっています。私自身、RenderやRailwayの無料で使える範囲で実験のみ使用し、本格的アプリをつくるときは、情報量の多いHerokuの有料プランを使おうと思ってます。なので自己責任でお願いいたします。ただHerokuは無料がなくなったので慣れていないうちから課金されてしまいます。そういった面でRenderの利用価値はあります。Renderの登録方法の説明はありません。
これをやっていきますので併せて参照してください。Getting Started with Django on Render

完成品(こんな簡単なものでもFreeププランだと立ち上がるまで30秒以上かかります。15分経って、また立ち上げると同じく30秒以上かかります。)
その他、私がRenderにデプロイしたものをポートフォリオに載せてます。

広告

Quickstartsをそのままやるのは断念

Install Poetryから始まっています。Windowsの場合PowerShellで実行する謎のコードが書いてあります。
Invoke-WebRequestについて検索するとMicrosoft BuildのInvoke-WebRequestが出てきます。このMicrosoft Buildでは変数に代入するような使用法だが、普通のPowerShellでは1文字目のrespose=みたいな、変数を書いて実行するとコマンドではないというエラーになる。
Invoke-WebRequest -Uri “目的のURL”で、目的のURLに要求を送って、レスポンスが表示されるようなので私のブログでやってみた。

Invoke-WebRequest -Uri "https://kikuichige.com/18569/"

実行後、レスポンスが表示されるのでInvoke-WebRequestコマンドが使えることが分かった。

しかしpoetryは仮想環境+pipみたいなパッケージ管理ツールみたいです。
Quickstartsに書いてあるpoetryをインストールするコマンドを実行すると
今までの開発環境が壊されそうでやめました。
ということでQuickstartsに沿いつつ以下の環境で実行しました。

開発環境

私の仮想環境はAnaconda、エディタはVSCodeでやってますので、この構成で説明します。
といってもここからは、他の仮想環境でも同じだと思います。

Create a Django Project

私の環境(【Docker】Windows11でプログラミング環境構築(Python、Django、Vue)→AnacondaでDjangoアプリを作る)で必要な操作は以下
Anaconda Navigatorを立ち上げ→Enviroments→workspace(事前に作った仮想環境の名前)→▷がクリックできるようになったらクリック→Open Terminal

あとはこの3つだけです。
django-admin startproject mysite
cd mysite

python manage.py runserver
Starting development server at http://127.0.0.1:8000/←ブラウザでこのurlに行きDjango画面が立ち上がれば成功です。
CTRL+C 停止
以降ターミナルの操作は、今のようにここを使います。

Create the Hello World Landing Page

python manage.py startapp render
を実行したあと
Vscode立ち上げ(仮想環境がAnacondaの場合、以下でmysiteディレクトリでVSCodeが立ち上がる)、ソースコードを編集していきます。
code .

Create the Render app②とWrite Your First Viewの①~④はそのままクイックスタートに書いてある通りです。Create the ~のところは指示通り新規でファイルやフォルダを追加してください。
④はrender/index.htmlではなくrender/templates/render/index.htmlなので注意。

⑤
render/static/renderのディレクトリを新規作成します。
Renderの画像を右クリック→「名前を付けて画像を保存」して上のディレクトリにrender.pngと言う名前で保存
⑥はindex.htmlに追記
⑦はそのままやってOK
目次へ

Update Your App For Render

Go Production-Ready

ここは環境変数の話です。環境変数はkeyとvalueが定義されている。
問題は環境変数が設定されているファイルがどこにあるのかである。
os.environで環境変数を取得していますが、
ローカル環境でsettings.pyに以下追加して実行すると
パソコンの環境変数が表示されます。

settings.pyにprint(os.environ)を追加して実行すると
environ({key:value,・・・})という形で表示され、いくつも変数が定義されているのが確認できます。おなじみの'PATH':も定義されているのが確認できます。
しかし、これはパソコンの環境変数で、今回、ここに定義するわけにはいきません。

そこで以下のような方法がある。(今回はやりません。)
django-environを使ってSECRET_KEYを.envから読み込む方法
しかしRenderなどは環境変数を、アプリ(Web Service)ごとの環境設定画面で設定できる。
Quickstartsも、その環境変数を利用することが前提で書かれた処理みたいです。

その点を確認しつつやっていきます。

SECRET_KEY

SECRET_KEYは以下を見る限り、必要であるがプログラミング時にSECRET_KEYを意識することはなさそうです。
SECRET_KEYとはどのようなものなのでしょうか
SECRET_KEYを消して実行するとエラーになるので、定義はしないとダメです。
なのでプロジェクトを作った段階で自動的にsettings.pyにSECRET_KEY = ‘*tvt@-k&(yan-#t^h!#9ge877776j1a)5c8)&ibas!ed$lr+5’のように定義されています。
本格的に運用するときは、これは見られてはまずいのでsettings.pyから消さなければなりません。
しかし消したらエラーになる。そこでRenderの各アプリ(Web Service)の環境変数にSECRET_KEYを設定するようです。

render_env

mysite/settings.py修正

コードを書いていきます。
Go Production-Readyの①~③settings.pyは以下のようになります。
独自に環境変数を確認するためのprint文を追加しました。

# SECRET_KEY =  '*tvt@-k&(yan-#t^h!#9ge877776j1a)5c8)&ibas!ed$lr+5'本番ではコメントアウトではなく完全に消す。
SECRET_KEY = os.environ.get('SECRET_KEY', default='your secret key')
# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG = True
DEBUG = 'RENDER' not in os.environ
ALLOWED_HOSTS = []
RENDER_EXTERNAL_HOSTNAME = os.environ.get('RENDER_EXTERNAL_HOSTNAME')
if RENDER_EXTERNAL_HOSTNAME:
    ALLOWED_HOSTS.append(RENDER_EXTERNAL_HOSTNAME)
#何が入ってるかターミナルに表示 start
print("SECRET_KEYは",SECRET_KEY)
RENDER = os.environ.get('RENDER')
print("RENDERは",RENDER)
print('RENDER_EXTERNAL_HOSTNAMEは',RENDER_EXTERNAL_HOSTNAME)
#何が入ってるかターミナルに表示 end
python manage.py runserverで実行するとターミナルに以下が表示されます。(なぜか2回表示する)
SECRET_KEYは your secret key
RENDERは None
RENDER_EXTERNAL_HOSTNAMEは None
SECRET_KEYは your secret keyとターミナルに出力されます
これは環境変数に'SECRET_KEY'が見つからないためdefault=に書いた文字列が表示されています。
目次へ

Configure Django for PostgreSQL

私はPostgreSQLの無料期間90日過ぎてるのでSQlite3しか確認できません。
なのでSQlite3を使います。SQlite3を使うとQuickstartsに出てくるデータベースの設定は、ほとんど必要なくなります。
Configure Django for PostgreSQLはやりません。(PostgreSQLを使う場合は必要、こちらを参考にしてください。)

Static Files

Static Filesの①poetry add ‘whitenoise[brotli]’はやりません。
requirements.txtにwhitenoiseを入れます。②③のみやります。

Create a Build Script

build.shをmanage.pyと同じ階層に作って内容は下記。pipでrequirements.txtを読み込みます。
build.sh

#!/usr/bin/env bash
# exit on error
set -o errexit

# poetry install
pip install -r requirements.txt
python manage.py collectstatic --no-input
python manage.py migrate

requirements.txtをmanage.pyと同じ階層に作って内容は下記。

django
gunicorn
whitenoise
以下2つはやらない
chmod a+x build.sh
poetry add gunicorn

Deploy to Render

Renderにデプロイする方法が2種類あります。

Use render.yaml for Deploys

私の場合、Blueprintsを使うと支払情報を入力する画面が出て先に進めなくなってしまいました。
制限にかかかっているようです。前はできたのですが・・・。
なので後述のManual Deploymentでやっています。
一応Blueprintsが使えたときのやり方を書いておきます。

render.yamlをmanage.pyと同じ階層に作って内容は下記。DATABASE関係は使わないので削除


services:
  - type: web
    name: mysite
    env: python
    buildCommand: "./build.sh"
    startCommand: "gunicorn mysite.wsgi:application"
    envVars:
      - key: SECRET_KEY
        generateValue: true
      - key: WEB_CONCURRENCY
        value: 4

GitHubにpushします。やり方はこちらを参考にしてください。(PaizaCloudからとなっていますがローカルからも同じです。ただGitのインストールとGitHubの登録は必要です。)

あとは②に書いてある通りRender DashboardからDeployしてください。こちらも参考にしてください。

Service Group Name は先程作成した render.yaml の services の name を入力します。
Applyをクリック。エラーになるので、こちらを参考にさせてもらい。
途中でエラーになったあと、Enviroment をクリックします。
Add Environment Variable で環境変数を設定します。
PYTHON_VERSION 3.8.10(Render の Python のデフォルト 3.7.0ではDjango4 がインストールできないようなので3.8 以上を設定)
Save Changes
Manual Deploy→Deploy latest commit
目次へ

Manual Deployment

Manual Deploymentの場合render.yamlとbuild.shは作らなくていいです。
GitHubにpushします。
DashboadでNew→Web Serviceクリック
Connect a repositoryで今回作ったものをCONNECT
nameをmysite
startCommand:をgunicorn mysite.wsgi:application
この意味ですがgunicornはアプリケーションサーバーというものでアプリを動かすものらしい。
あとはプロジェクト作成時に自動でできるwsgi.pyの場所を書いて:applicationを付ければいいようです。

Build Commandを
pip install -r requirements.txt && python manage.py collectstatic --no-input && python manage.py migrate

Create web service
途中でエラーになる。そのあと、Enviroment をクリックします。
Add Environment Variable で環境変数を設定します。
PYTHON_VERSION 3.8.10(Render の Python のデフォルト 3.7.0ではDjango4 がインストールできないようなので3.8 以上を設定)
SECRET_KEY
yamlを使う場合、以下のようになっています。

key: SECRET_KEY
        generateValue: true

これは多分Manualの場合、valueのところのgenerateを押すとvalueに乱数がはいるので、このことを指しているものと思われます。
しかし桁数がsettings.pyより短いところが気になります。
なので私はsettings.pyのものを消して、こちらにコピーしています。

Create Django Admin Account

Quickstartsでは
python manage.py createsuperuserをShellで実行するように書いてあります。

しかし無料プランでは使えないみたいです(Shell is not supported for free instance types.)

Build Commandの最後に以下を追加してやってみました。
&& python manage.py createsuperuser
エラーにはなりませんが、logに以下がでて実行されませんでした。
Superuser creation skipped due to not running in a TTY. You can run manage.py createsuperuser in your project to create one manually.
「TTYで実行されていないため」ということですが、TTYを調べると「標準入出力となっている端末デバイス」ということです。多分、Renderのlogでは出力だけの機能しかなくキーボードで打ち込む入力の機能がなくて、できないということだと思います。
有料のShellやローカルで使っているターミナルでは名前やパスワードを聞かれるたびに対話型でキーボードで入力できます。それがlogではないということだと思います。

そこでこちのコマンドを使わせていただきます。ソースコードを修正します。
作る場所はrender/management/commands/superuser.py

settings.pyに以下追加(環境変数からsuperuser.pyに渡すため)
SUPERUSER_NAME = os.environ.get("SUPERUSER_NAME")
SUPERUSER_EMAIL = os.environ.get("SUPERUSER_EMAIL")
SUPERUSER_PASSWORD = os.environ.get("SUPERUSER_PASSWORD")

GitHubにプッシュしたら
Renderのアプリのsettingにコマンド追加
pip install -r requirements.txt && python manage.py collectstatic --no-input && python manage.py migrate && python manage.py superuser
環境変数に以下を追加
SUPERUSER_NAME admin(値は自分で決める)
SUPERUSER_EMAIL admin@admin.com(値は自分で決める)
SUPERUSER_PASSWORD password(値は自分で決める)
Save Changes
Manual Deploy→Deploy latest commit

まとめ

個人的な解釈でDjangoで作ったものを公開することを目的として書いたものです。
本格的、運用では改めてご確認ください。
ただデプロイまでやっておくと流れがわかるので、後はローカル環境で勉強すればいいと思います。
目次へ

この記事を書いたイチゲを応援する
Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)

コメント

タイトルとURLをコピーしました