djangoとreactを組み合わせた例を記す
Lalavelはとてもよくできたフレームワークで、単体でも使えるし、apiだけとしても使えるし、react/vueをtemplateに組み込むこともでき、如何様にも使える
python界隈でもやりたい、ということで
djangoを利用して、reactと共存させることにする
昨今では client と api を分けるのはあたりまえ
デプロイ先もクラウドを使用するのがあたりまえ
ただ個人開発や、金銭的事情から1つのサーバーにデプロイしたいなど、モノレポ的な要望は少なくない
django
先ずはdjangoのセットアップから
djangoの思想は1つのプロジェクトの中に、複数のアプリケーションだが、私はそれが嫌いだ
1つのプロジェクトに1つのアプリケーションを構築するなら、同じ名前か汎用的な名前をディレクトリにつけたい
尚、コマンド内の[slag]は任意の値に変更されたし
mkdir [django-react]
cd django-react/
django-admin startproject config
ここではアプリケーション全体を管理しているという意味でconfigとつける
config/config/*
というディレクトリが出来上がるので、1つ階層を削除する
(ここで例えば、foxというプロジェクト名をつけたらfox/foxとなり、さらにアプリケーション名をfoxとしたいがディレクトリがかぶってしまうので、泣く泣く意味不明な違う名前をつけざるを得ない。例えばkitsuneというアプリ名をつけたら、本来foxだったものが、別の名前のアプリになっており、意味も似通っているので何がしたかったのか分からなくなる。この辺がdjangoはナンセンスだと思う)
さて、この状態で
python manage.py runserver
とすると通常にサーバーが立ち上がるはず。
立ち上がらない場合は何かがおかしいので、コードないのディレクトリ構成を見直すこと。
python manage.py startapp app
次に、上記でバックエンド用のファイル群を作成する
ここにはMVT(MVC)が表現されてくる
次は適当なファイル変更を行う
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world.")
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
]
from django.contrib import admin
from django.urls import path
from app.views import index
urlpatterns = [
path("", index),
path("admin/", admin.site.urls),
]
上記のコードで再度サーバーを立ち上げると Hello world が表示されていたら、正常である
次に、config/settings.py の INSTALLED_APP に app を追加する
python manage.py migrate
python manage.py createsuperuser
これを行うことで、初期のuserテーブルなどが作成される
2行目はスーパーユーザーの作成で、対話型形式に沿ってアカウントを作成する
https://localhost:8000/admin で管理画面にアクセスできる
react
npm create vite@latest client -- --template react-ts
reactは現在 next.js や remix などのフレームワークを使用することを推奨している。
しかし上記の2点を使うような開発では、そもそもこんな変な構成を採用しないと思うので、今回は SPA で簡単にセットアップする
勘所
def index(request):
# 開発はReact開発サーバーを使用
# 本番時はビルド済みのファイルを参照するため、npm run buildしておく
if settings.DEBUG:
return HttpResponseRedirect("http://localhost:3000/")
else:
return render(request, "build/index.html")
この構成では、client側のコードを全てreactに任せるということなので、url は react に全振りする
開発時はnpm run dev
とpython mange.py runserver
で django と react を両方起動して開発する
本番環境では build したファイルを読ませる
上記のようにpython側で制御することによって共存させることを可能にした
Discussion