AWSの統合開発環境cloud9でDjangoを利用する方法を解説

今回はPythonのWebフレームワーク「Django」の環境構築を解説していきます。本記事ではAWSのcloud9というものを使っての環境構築ですのでAWSへのアカウントの登録が必要です。アカウント登録自体は無料でできますし無料でできるものもあるのでそちらを利用することをオススメします。

またcloud9でなくても同じようにやっていただければ環境は整うと思うのでcloud9でない方も参考にしていただけるとありがたいです。

AWSへの登録はこちら↓

<本記事で解説すること>
・Djangoの開発環境構築
・基本的な画面の表示
・データベースの設定

目次

プロジェクトを作成

まずはプロジェクトを作成するために以下のコマンドを打ってください。

django-admin startproject プロジェクト名

プロジェクト名は自分の好きな名前で大丈夫です。私は今回「app」という名前で作りますので以下になります。
「$」は入力しなくて大丈夫です。

$ django-admin startproject app

次はmanage.pyがあるディレクトリでアプリケーションを作成するため、現在ディレクトリにmanage.pyがあるかを確認してください。以下のコマンドで確認できます。

$ ls
app  manage.py

「app manage.py」の部分は出力結果となります。出力結果にmanage.pyがあればOKです。ない場合は以下のコマンドでディレクトリを移動してください。

$ cd ディレクトリ名

manage.pyがあるディレクトリで以下のコマンドを入力します。

$ python manage.py startapp アプリケーション名

アプリケーション名は自由に決めてもらって大丈夫です。このサイトではアプリケーション名を「sample_app」にします。なので以下のようになります。

$ python manage.py startapp sample_app

これでアプリケーションの基盤を作成できました。次の章では実際に開発用サーバーを立ち上がらせるための設定をしましょう。

開発用サーバを立ち上げる

ではここからは自分がコーディングしたものを確認するための開発用サーバーの立ち上げを行なっていきます。まずは以下のコマンドを打ってください。

$ python manage.py runserver $IP:$PORT

コマンドを実行しますとエラーが出ると思います。これはブラウザで表示するためのホスト名を許可していないために起こるエラーです。なので許可をするためにはエラー内容の以下のものをコピーしてください。

「eadab8c225cd405bb0a22632d4231c80.vfs.cloud9.ap-northeast-1.amazonaws.com」の部分だけをコピーしてください。

それではコピーしたコードをsettings.pyの中に貼り付けます。
settings.pyとは必要な機能などの設定をするファイルです。「何かを設定するときはsettings.pyで設定するんだな〜」くらいの理解で大丈夫です。

ALLOWED_HOSTS = ['eadab8c225cd405bb0a22632d4231c80.vfs.cloud9.ap-northeast-1.amazonaws.com']

初期ではALLOWED_HOSTS = []となっていると思うので先ほどコピーしたホスト名を[]の中に貼り付けてください。ここで注意なのが、シングルクォーテーションで囲むのを忘れないでください!

あとは日本語の設定にしておきましょう。日本語設定もsettings.pyで設定します。

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

先ほどコマンドでアプリケーションを作成したと思うのですが、settings.pyにアプリケーションの設定もしなくてはなりません。INSTALLED_APPSに追記しましょう。

INSTALLED_APPS = [
# ここから
    'sample_app.apps.SampleAppConfig'
# ここまでを追記
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

「アプリケーション名.apps.アプリケーションフォルダ(本サイトならsample_appフォルダ)のapps.pyのクラス名」を追加します。これでアプリケーションの設定が完了しました。以下のコードです。

from django.apps import AppConfig

# このSampleAppConfigを設定
class SampleAppConfig(AppConfig):
    name = 'sample_app'

この設定を終えた後、以下のような画面がでたら成功です。

ちなみにCtrl + C でサーバを落とすことができます。

マイグレーションを行なってデータベースを使用する

Djangoではブラウザ上でデータベースを確認することができます。そのためにはマイグレートを行わないといけません。またターミナルでコマンドを打っていくという感じになります。

現在$ python manage.py runserver $IP:$PORTのコマンドを実行したときに以下のような警告が出ると思います。

$ python manage.py runserver $IP:$PORT
Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

これは「データベースを使うための処理(マイグレート)がされてないよ!」という意味になります。なので以下のコマンドでマイグレートをして設定しましょう。

$ python manage.py migrate

コマンド実行後はログにOKと出るはずなので、OKと出力されたら大丈夫です。

次は管理ページにアクセスする際のユーザーとパスワードを設定します。

$ python manage.py createsuperuser

実行するとUsername、Email、Password、Password(again)の順番に出てくるのでそれぞれ設定してください。以下が例となります。

Username (leave blank to use 'ec2-user'): saku
Email address: sakusaku@mail.com
Password: 
Password (again): 

成功すると「Superuser created successfully.」と出力されるのでこれが出ればOKです。

それでは以下でサーバーを立ち上げ確認しましょう。

$ python manage.py runserver $IP:$PORT

URLの語尾に/adminを付け加えて実行し直してください。

私の場合は「https://eadab8c225cd405bb0a22632d4231c80.vfs.cloud9.ap-northeast-1.amazonaws.com/admin/login/?next=/admin/」となります。

先ほど設定したUsernameとPasswordでログインをして以下のようなページが出れば成功です。

ビューを作成

ビューを作成していきますが、まずビューとは何かについて説明していきます。ビューはモデルとテンプレートのやり取りを行う大切なものです。
例えば、先ほど解説したデータベースはモデルとなります。ビューでモデル(データベース)に対して対象のデータを要求します。それをモデルはビューに返してあげるといった流れになります。

では次にテンプレートとは何かと言いますとHTMLのことを指します。Web画面はHTMLで記述されていますが、テンプレートはまさにユーザインタフェースです。ユーザーの操作する画面だと思ってください。詳しくは後ほど解説していきます。

ではここから実際にビューを作成していきましょう。views.pyに以下のコードを書きます。

from django.http import HttpResponse

def index(request):
    return HttpResponse('始めてのDjango!!')

ではコードの解説をしていきます。
まず一番上で「HttpResponse」というものをインポートしています。これはDjangoの標準の関数で、ブラウザ上に値を表示するという処理をしてくれます。

「def index」関数になります。indexの部分の名前は自由につけてもらって大丈夫です。

次はビューを表示するためにURLを設定します。webでURLを指定してそのURLに対応するビュー関数を表示するといった流れになります。それでは「urls.py」を新しく作成します。

今回はsample_appの直下に作っていきます。

sample_appは上で設定したアプリケーション名です!

from django.urls import path
from . import views

app = 'sample_app'
urlpatterns = [
    path('', views.index, name='index'),
]

簡単に説明しますと、「urlpatterns」で先ほど作成したindex関数を呼び出しています。pathの第一引数である「”」はサーバを起動したときに一番最初に表示されるurlです。つまりここに/sampleと指定したらurl~~/sampleのURLの時に表示するということです。

先ほどsample_app/urls.pyを作成しましたが、それだけではまだ足りません。元からあるapp/urlsも編集しないといけないので以下のように編集しましょう。

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('', include('sample_app.urls')),
    path('admin/', admin.site.urls),
]

pathで指定することにより、sample_app/urls.pyが有効になります。

ではrunserverを実行して表示されるか確認してみましょう!

idを活用して表示を変える

次はURLによって表示を変えることを変数を利用して行います。まずは以下のようにコードを追加してください。

from django.http import HttpResponse

def index(request):
    return HttpResponse('始めてのDjango!!')
    
    
# 今回追記
def value(request, value_id):
    msg = str(value_id) + '回目のDjango'
    return HttpResponse(msg)

value_idがURLに指定する数字です。後に設定しますが、URLで数字を指定するとvalue_idに入ってそのまま画面に表示するといった仕様になっています。
その値をmsgという変数に格納して表示しています。

では次に関数を作ったので表示するURLを設定しましょう!

from django.urls import path
from . import views

app = 'sample_app'
urlpatterns = [
    path('', views.index, name='index'),
    # ここを追記
    path('value/<int:value_id>/', views.value, name='value'),
]

URL/value/〇〇の〇〇に数字を指定しますと画面側の表示が指定する数字によって変わります。
以下はURL/value/12のURLの結果です。

valueの後に12を指定しているので「12回目のDjango」とメッセージが変わります。

テンプレートを作成

テンプレートはビューからの要求に応じて要素を返す役割をしています。もう少し詳しく解説しますと、ビューから「これを出力して欲しい」と要求があればその要求に合わせて文字の大きや位置、色などが定義されているテンプレートを返すといったイメージです。

ではここからは実際にテンプレートを作成していきます。
sample_appの直下に「templates」という名前でフォルダを作成してください。そのtemplatesの直下に「sample.html」ファイルを作成してください。

sample.htmlの名前は任意で大丈夫です!!

<h2>{{ title }}</h2>
<p>{{ word }}</p>

{{}}で囲ってある箇所はビューの値を表示します。{{}}で囲むことによりビューの値を表示できるので覚えておきましょう。

では次にビューの方も編集していきます。

# 省略
from django.template import loader

# 省略
    
def sample(request):
    template = loader.get_template('sample.html')
    context = {
        'title': 'タイトル',
        'word': '文字'
    }
    return HttpResponse(template.render(context, request))

loaderは「sample.html」を指定するために使います。その後、contextでテンプレートの{{ title }}と{{ word }}を指定してそこにそれぞれ、「タイトル」と「文字」を入れるようにしています。
では次はURLを設定します。

# 省略
urlpatterns = [
    # 省略
    path('sample/', views.sample, name='sample'),
]

ではここで一旦確認してみてください。動作に問題なければ次はテンプレート作ります。
テンプレートはベースとなるHTMLで、大体のサイトはヘッダーとフッターのデザインが統一されてると多います。統一されているのはベースとなるHTMLを呼び出しているからで、毎回書いているわけではありません。
今からそのベースとなるHTMLを作ります。

templatesフォルダの直下に「base.html」を作成してください。

<header>
    <h1>サクサクスクール</h1>
</header>
<body>
    {% block content %}{% endblock %}
</body>
<footer>
    <small>© 2021 sakusaku-school inc.</small>
</footer>

上記のように「base.html」を作成してください。
ここで始めて出てくるのが、bodyタグの中の{% block content %}{% endblock %}です。
これは呼び出し元でしているするために必要で、あくまでもベースのHTMLなので中身はそのページによって変えたいと思います。なので{% block content %}{% endblock %}を書くことによりページによって内容を変えることができます。

次に呼び出し元のHTMLを変えていきます。

{% extends 'base.html' %}
{% block content %}
    <h2>{{ title }}</h2>
    <p>{{ word }}</p>
{% endblock %}

一番上の{% extends ‘base.html’ %}でbase.htmlを使うことができます。次に{% block content %}{% endblock %}ではbase.htmlに記述した{% block content %}{% endblock %}に入る中身の部分を記述しています。

ではここで確認してみましょう!
以下のようになると思います。

これでベースとなるテンプレートの作成は終わりです。

モデルを作成

次はモデルの作成に移ります。モデルとはデータベースの操作ことでモデルを活用できるようになればデータベースを自由に操ることができます。

では実際にモデルを作成していきましょう!
以下のコードを書いてください。

from django.db import models

class Sample(models.Model):
    name = models.CharField(max_length=50)
    comment = models.TextField()
    createtime = models.DateField(auto_now_add=True, blank=True)

ここではモデルを作成するためのコードを書いています。
name、comment、createtimeは全てカラムを定義しています。=のあとはカラムの種類を意味しています。

次にモデルを作成するために以下のコマンドをターミナルで実行します。

$ python manage.py makemigrations
$ python manage.py migrate

両方ともターミナルからOKの応答が返ってきたら大丈夫です。
エラーが出る場合はmodels.pyを見直してみましょう!

続いてデータベースを管理画面で確認できるように設定をします。

from django.contrib import admin
from .models import Sample

admin.site.register(Sample)

ではrunserverを実行して確認しましょう!

URLの後に/adminをつけて検索してみてね!

以下のようにデータベースが作成されていると思うので追加ボタンを押して追加しましょう!

このように追加できたと思います。しかしSample object(1)だと訳が分かりませんよね?なのでここも編集していきます。ついでにデータベース名のSamplesとNameとCommentも変えます。

from django.db import models

class Sample(models.Model):
    name = models.CharField(max_length=50, verbose_name='タイトル')
    comment = models.TextField(verbose_name='コメント')
    createtime = models.DateField(auto_now_add=True, blank=True)
    
    def __str__(self):
        return self.name
        
    class Meta:
        verbose_name_plural = 'サンプル'

verbose_nameで指定した名称が追加画面に反映されたと思います。またテーブル名はサンプルに、データの名前はSample object(1)から自分が設定したnameの値に変わっていると思います。これでかなり見やすくなりました。

データベースの値をテンプレートに表示

では先ほど作成したデータベースの値をテンプレートに表示していきます。私の場合の中身はこのような感じです。

このタイトルとコメントをテンプレート側で表示していきます。

# 省略
from .models import Sample

def index(request):
    template = loader.get_template('base.html')
    samples = Sample.objects.order_by('created_at')[:3]
    context = {
        'samples': samples
    }
    return HttpResponse(template.render(context, request))

# 省略

def sample(request):
    template = loader.get_template('sample.html')
    sample = Sample.objects.all()
    context = {
        'sample': sample
    }
    return HttpResponse(template.render(context, request))

importするmodelはmodels.pyのクラス名を指定しましょう。また今回追加の”samples = Sample.objects.order_by(‘created_at’)[:3]”では追加された順で3つ表示するというものです。現在はデータが1つしかないのであまり関係ないですが、データを新たにいくつか追加してみると追加した順に並ぶと思います。
“sample = Sample.objects.all()”の部分ですが、”objects.all()”で全ての要素を取得という意味になります。

{% extends 'base.html' %}
{% block content %}
{% for row in sample %}
    <p>{{ row.name }}</p>
    <p>{{ row.comment }}</p>
{% endfor %}
{% endblock %}

ここではfor文で値を取得しています。forを使うときは必ず{% %}で囲うこととforの終わりに{% endfor%}を忘れないように気を付けてください。

まとめ

・Djangoではビュー、テンプレート、モデルが大事
・ビューはモデルとテンプレートとの橋渡し
・テンプレートはユーザーが見る部分
・モデルはデータベース

今回は上記の4項目を理解できたらとりあえずは大丈夫です。本記事ではDjangoの基本中の基本なので理解必須です。しかし一気に覚えるのは厳しいと思うので本記事を何回も見直して開発をしていただけたらと思います。

これからはもう少し踏み込んだ内容を解説していきますのでよろしくお願いいたします。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる