AWS EC2とDjango を使いたい未経験者へのtip②
AWS EC2 と Django を使って駆け出しエンジニアを目指す方へ
この記事は、
AWS EC2とDjango を使いたい未経験者へのtip
の続きとなります。ぜひ合わせてご覧ください。
この記事では、チュートリアルがメインになるので、Djangoができる人は読み飛ばしてもらっていいです。
自己紹介
初めまして、ぴくむんといいます。色々あってwebエンジニアになることになりました。
そこで、Djangoを学ぶ事になったので、忘れない様にメモしときます。誰かの役に立てれば幸いです。
この記事は、
【Docker(Docker-Compose)】Python,Djangoの開発・本番環境構築【Postgres,Gunicorn,Nginx利用】
Get Started With Django Part 1: Build a Portfolio App
に沿って、自分の知見を混ぜ合わせながら解説しようと思います。PC: Mac book Air
OS: Catalina
Docker:4.1.0
を使っております。
読者想定
私は、Djangoを使って掲示板みたいなwebサービスを作りAWSEC2でデプロイしたぐらいの経験者です。
いろんな背景を持った方が見てくれてるかもしれませんが、ゲームでチュートリアルが終わった人が初めてゲームをプレイする人に向けたぐらいのレベルぐらいの記事だと思っていただけると助かります。
間違いも多いと思うので、もっといい記事にするためにもコメントよろしくお願いします。
アプリ立ち上げ
前回からやるとディレクトリはこうなっていると思います。
Docker-Django
├── .env.dev
├── django_project
│ ├── Dockerfile
│ ├── db.sqlite3
│ ├── manage.py
│ ├── project
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ ├── asgi.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── requirements.txt
│ └── venv
└── docker-compose.yml
django_project上で前回作った仮想環境を有効化します。
$source venv/bin/activate
appを立ち上げないといけないので、一旦前回書き直したmanage.pyの中身を.env.devから抜き出して上書きます。
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'セキュリティキー'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['*']
$python manage.py startapp hello_world
これで、hello_wordのフォルダができたと思います。
解説
簡単にプロジェクトファイルとappファイルについて説明します。
イメージとしては、
プロジェクトファイルがスマホで
appファイルがアプリに
が近いかと思います。基本的には、1プロジェクト1appと思っています。
プロジェクトファイル
プロジェクトファイルでよく使うのは、settings.pyとurls.pyです。
settings.pyは、メインの設定をします。
開いてみるとわかるのですが、
ここで、どこの何を使うのかを書かないといけません。HTMLはここにおいているとか、画像ファイルはここにおいているとか、その様な感じです。
例えば、
INSTALLED_APPSで、アプリの管理をしています。さっき新たに、hello_world というアプリを立ち上げたのでここに追加する必要があります。
urls.pyですが、ここではurlと開くページの管理をしています。
appファイルに新たにurls.pyを入れて、そこで管理します。
appファイル
appファイルでよく使うのは、admin.pyとmodels.pyとviews.pyとurls.pyです。
admin.pyは、Djangoは、adminページを勝手に作ってくれいて、そこにログインする事により、DBにアクセスでき、色々いじることができます。そのadminページに何を表示するか選択するファイルになります。
models.pyは、DBの設定になります。
例えば、
class RelationFollow(models.Model):
to_user = models.ForeignKey(
User, models.CASCADE, null=True, related_name="to_user")
from_user = models.ForeignKey(
User, models.CASCADE, null=True, related_name="from_user")
とする事により、RelationFollowというテーブルができ、to_userとfrom_userというカラムができます。
この様にして、色々なテーブルを作っていきます。
最後にメインのviews.pyになります。
ここでは、主にアクセスした人に何を渡すかをプログラムします。HTMLだったり、DBの中身だったりします。
例えば、
def index(request):
return render(request, 'index.html')
とする事により、index.htmlをアクセスした人に表示させるという様な感じです。
ここの関数の名前のindexはurls.pyに記述する事により紐付けすることができます。
つまり、urls.pyは、ブラウザのurlとviews.pyに書いている内容を紐付けする役割を持ちます。
まとめ
雑にまとめると
プロジェクトファイルはスマホ
appファイルはアプリ
プロジェクトファイル:
settings.py→何をつかうよと説明、アプリはこれを使うよ or どこに何があるか説明するやつ、画像入れはここだよとか
urls.py→appファイルのurls.pyを読み込めと設定する
appファイル:
urls.py→ブラウザのurlとviews.pyに書いている内容を紐付けするやつ
admin.py→管理画面設定
models.py→DB設定
views.py→ページ設定
これを意識しながら、勉強すると習得度が上がると思います。
Hello World
それでは、みんな大好きヘローワールドです。
先に手順を説明します。
①HTMLのヘローワールドを用意する。
②それを表示させるために、appファイルのviews.pyに、HTMLを表示させる関数を作る。
③その関数とURLを対応させるために、appファイルに新たにurls.pyを作成し、紐付けリストを作る。
④それができたら、プロジェクトファイルのurls.pyにappファイルのurls.pyを読み込めと書き込む。
最後にrunserverで立ち上げるので、別に順番はどうでもいいです。
もしもうまく行ってなかったらエラー吐き出しますので、安心してミスってください。
それではやっていきましょう。
①HTMLのヘローワールドを用意する。
hello_worldのディレクトリ内にtemplatesというフォルダを作成し、hello_world.htmlを作成します。
<h1>Hello, World!</h1>
Djangoは基本的には、templatesというフォルダを作成し、その中にhtmlを入れていきます。
cssに関しては、staticというフォルダを作成してやっていきますが、pathをプロジェクトファイルのsettings.pyを指定してあげる必要があります。
もちろんpathを書けばどうにでもなるので、今回はデフォルト設定なのでhello_worldのディレクトリ内にtemplatesを作っていますが、pathさえ通せばどこでもいいです。
例えば、hello_worldと同層がよければ、以下の設定にすればいいです。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
#↑これが追加された。何も書いていないのがデフォルト設定。
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
今回は、デフォルト設定でやるので、これはいじらないでください。
②それを表示させるために、appファイルのviews.pyに、HTMLを表示させる関数を作る。
それでは、appファイルの中のviews.pyを以下の様に設定します。
from django.shortcuts import render
def hello_world(request):
return render(request, 'hello_world.html', {})
renderは、表示を差し替えろという意味です。
親戚にredirectってのもいます。
詳しくは、
Djangoのviews.pyのredirect、render等の違い
https://qiita.com/taole33/items/1dfc0d46462c9e512385
を参照してください。
③その関数とURLを対応させるために、appファイルに新たにurls.pyを作成し、紐付けリストを作る。
それでは、appファイルに新たにurls.pyを作成し、以下の様に書き換えてください。
from django.urls import path
from hello_world import views
urlpatterns = [
path('', views.hello_world, name='hello_world'),
]
''とviews.hello_worldに紐付けましたね。
''は、最初のURLになります。もしも、追加URLがやりたければ'hello_world/'とすればいいです。
今回は、デフォルトです。
④それができたら、プロジェクトファイルのurls.pyにappファイルのurls.pyを読み込めと書き込む。
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('hello_world.urls')),
]
include('hello_world.urls')によって、appファイルのurlsを読み込みました。
これで、
デフォルトページにアクセス
↓
プロジェクトファイルのurls.pyで
hello_world.urlsに飛ばされる
↓
appファイルのurls.pyで
views.hello_worldに飛ばされる。
↓
render(request, 'hello_world.html', {})
という順番になると思います。
それでは、
python manage.py runserver
と出てきたと思います。出てこなかった場合は、エラーメッセージや、templatesのフォルダの位置などを確認してみてください。
Discussion