気ままに趣味旅行

面白いコト「拡がる/拡げる」

WEBアプリケーションを作る2ーDjango編

どうもhiroakiです。

 

先日より、HTMLとCSSについて扱ってきました。

今回は、Djangoを使ったWEBアプリケーションを作ってみたいと思います。こちらも初めて作りますので、間違いなどあれば、ご指摘ください。

 

 

HTMLファイルを表示する(1)

次に、templatesフォルダを用意して、表示方法を変えてみます。前回、djangoの動作イメージを示しましたが、ここでウェブの見た目を指定します。

テンプレートフォルダと、その中にbbsフォルダを用意しましょう。この中に、index.htmlファイルを作ります。

myapp/

 └  bbs/

           └  templates/

                  └  bbs/

                        └ index.html  

 

  1. <-- myapp/bbs/templates/bbs/index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset='utf-8'>
  6. <title>気ままに趣味旅行</title>
  7. </head>
  8. <body>
  9. <h1>HTMLを表示できています!</h1>
  10. </body>
  11. </html>

 次に、views.pyのindex関数内を次のように変更します。

  1. #myapp/bbs/views.py
  2. from django.shortcuts import render
  3. from django.http import HttpResponse
  4. def index(request):
  5.     return render(request, 'bbs/index.html')

5.のrenderはデータとテンプレートを組み合せて、ウェブページを返すショートカット関数です。Djangoが用意している便利な関数をショートカット関数といいます。2.でshortcutsと書いていますね。かっこ内のbbs/index.htmlは先ほどtemplates内に作成したbbsフォルダのindex.htmlファイルのリクエストを受け取るという意味です。

 

HTMLファイルを表示する(2)

先ほどの内容を少し変更しましょう。

  1. #myapp/bbs/views.py
  2. from django.shortcuts import render
  3. from django.http import HttpResponse
  4. def index(request):
  5.     context = {'message': 'ようこそBBSへ',
  6.                       'players':['勇者','戦士','魔法使い']}
  7.     return render(request, 'bbs/index.html', context)

renderに第3引数を指定すると、ウェブページに反映させることができます。そのためには、次のようにします。

  1. <-- myapp/bbs/templates/bbs/index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset='utf-8'>
  6. <title>気ままに趣味旅行</title>
  7. </head>
  8. <body>
  9. <h1>HTMLを表示できています!</h1>
  10. <p>{{ message }}</p>
  11.     {% for player in players%}
  12.         <p>{{ player }}はモンスターと戦った。</p>
  13.     {% endfor %}
  14. </body>
  15. </html>

Djangoでは{{}}で中のデータを出力します。また、{%%}内にPythonのコードを書くことができます。Flaskの時と同じです。for文の場合は、終わりにendforをすることを忘れないようにしましょう。

 

データベースを作る

Djangoでは標準でSQLiteが準備されています(以下7.行目参照)が、それ以外のデータベースを利用する場合は、あらかじめデータベースを作っておく必要があります。前回紹介しましたが、ひとつのウェブサービスにはひとつのデータベースを紐づけるのが通常です。データベースを作る方法をまとめましたので、ひとまず自分でデータベースを作ってみましょう。ここではMySQLを使用しています。

hiroakies.hatenablog.com

次に、PythonからMySQLを操作するためのパッケージであるPyMySQLをインストールします。

  1. pip install PyMySQL

次に、さきほど作ったデータベースをセッティングして、使えるようにします。4.5.行でpymysqlをimportすることを忘れないでください。

  1. #settings.py
  2. ~~
  3. # Database
  4. import pymysql
  5. pymysql.install_as_MySQLdb()
  6. DATABASES = {
  7. #以下のようにDjangoではデフォルトでsqlite3がインストールされています。内容をコメントアウトするか、消去してください。
  8. # 'default': {
  9. # 'ENGINE': 'django.db.backends.sqlite3',
  10. # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }
  11. 'default': {
  12. #バックエンドにmysqlを設定します。
  13. 'ENGINE': 'django.db.backends.mysql',
  14. #MySQLで作成したデータベース名を書きます。
  15. 'NAME': 'mydb',
  16. #MySQLのユーザー名とパスワード。
  17. 'USER': 'root',
  18. 'PASSWORD': '',
  19. #ホスト名は今回はローカルホストを設定しています。
  20. 'HOST': '127.0.0.1',
  21. #ポートは初期設定では3306になっています。
  22. 'PORT': '3306',}
  23. }
  24. ~~

これで、MySQLのmydbデータベースを登録できました。

 

これからこのデータベースを動かしていくわけですが、流れとしては次のようになります。

①モデルにテーブルレイアウトを記述する。

②makemigrationsコマンドを実行して、データベースに対する変更指示書(migrationsファイル)を作成する。

③migrateコマンドを実行して、データベースを準備する。

 

①モデルにテーブルを作る

次にDjangoからデータベースを操作する「モデル」について紹介します。モデルを使えば、SQLを書かなくても、Pythonコードでデータベースのレコードをオブジェクトとして操作できます。

f:id:hiroakies4463:20181218165907j:plain

このようにオブジェクトでデータベースを操作するツールを「ORマッパー」(Object-Relational Mapper、ORM)と呼びます。

models.pyを開き、Articleモデルにcontentカラムを定義します。

  1. #models.py
  2. from django.db import models
  3. class Article(models.Model):
  4.     content = models.CharField(max_length=200)
  5.     def __str__(self):
  6.         return self.content

 

②③マイグレーションを行う

マイグレーションとは、データベースの中身を一括して移行したり変更したりする作業のことを言います。Djangoでは、モデルを作成しておくと、マイグレーションコマンドでMySQLのテーブルを作成することができます。

Djangoマイグレーションは、以下の2段階で行います。

②データベースに対する変更指示書(migrationsファイル)を作成する。

  1. python manage.py makemigrations bbs

 ③データベースを準備する。

  1. python manage.py migrate

 

 

管理者の登録

Djangoには、あらかじめ便利な管理機能が用意されています。この管理画面からデータベースの内容を変更することも可能ですので試してみましょう。

次のコマンドで管理者を登録していきます。

  1. python manage.py createsuperuser

コマンドが実行されると、以下が表示されます。※私のPCだけかもしれませんが、パスワードには何度打ち込んでも空欄に見えるよう設定されてました。私は「なぜ何も入力できないんだ!?」とここで何時間も時間を取られましたので(笑)、みなさんも注意してください。

  1. Username:
  2. Email address:
  3. Password:
  4. Password (again):

入力後、successfullyと出力されれば登録に成功です。

次に、admin.pyを以下のように変更します。

  1. #admin.py
  2. from django.contrib import admin
  3. from .models import Article
  4. admin.site.register(Article)

以上になります。

では、http://localhost:8000/adminにアクセスしてみましょう。管理画面が現れますので、先ほど作成したUsernameとPasswordを使ってログインします。モデルに登録したcontentカラムが表示されていれば成功です。ここを編集して、内容を変更することができます。

 

他にも、Shellコマンドを使うことでデータベースを変更することもできます。以下の記事を参考にしてみてください。

www.sejuku.

 

最後に、コマンドラインからSQLを実行して、変更した内容が紐づけたデータベースに反映されているか確認してみましょう。反映できていれば成功です。

 

 

今回は以上になります。お疲れ様でした。

不明点などありましたらコメントください。なかなか難しいところですが、一緒にがんばっていきましょう。

では。