Djangoを使ってWebアプリケーションを作る
目的
Python用のWebアプリケーションフレームワーク「Django」の入門的教材の作成
作業と学習の記録
最終的に、簡単な自作Webアプリケーションをデプロイする
/icons/hr.icon
Django(ジャンゴと読む)についての簡単なまとめ
フルスタックだが、主にバックエンド用(フロントも作れなくはないが、独立して作成するのがよい。vueなどで)
同じくPythonのWebアプリケーションフレームワークである「Flask」に比べて、大規模な開発向き
セキュアなアプリの開発が可能
例えば、{% csrf_token %} を埋め込むだけで、クロスサイトリクエストフォージェリ対策が可能である
クライアント側に悪意のあるリクエストを受け入れさせる攻撃
MVCモデル(アーキテクチャ)を採用
プログラムを役割毎に分けて管理する設計モデル→保守性の向上
M:Model(Webアプリとデータベース間のやり取り)
V:View(画面に表示されるページの作成)
C:Controller(アプリ全体の制御)
/icons/hr.icon
Djangoのクイックスタート
環境構築から、Djangoのデフォルトページをブラウザからアクセスするまでの流れ
仮想環境の設定
今回はvenvを使用
開発用の新規フォルダを作っておく(名前はなんでも、例えばwebapp1)
cd webapp1
ターミナルで以下のコマンドを実行
任意のフォルダ上でpython -m venv 仮想環境名を実行(例:python -m venv venv)
source 仮想環境名/bin/activate で仮想環境を有効にする
無効にしたい場合は deactivate
Djangoのインストール
pip install django
Djangoプロジェクトの作成
これから作るプログラム等は一つのプロジェクト内でまとめて管理する
例えば「ECサイト」を作るとき、その中には「商品管理機能」「決済機能」といった様々な機能が備わっている必要がある
この時、「ECサイト」が「プロジェクト」に当たり、「商品管理機能」「決済機能」が「アプリケーション」に当たる
ターミナルでdjango-admin startproject プロジェクト名 を実行(名前はなんでも、例えばdjango_app)
すると、カレントディレクトリ直下にプロジェクト名と同じ名のフォルダが作成される
(開くと全く同じ名前のフォルダがもう一つできている)
ディレクトリはこんな感じになっている
code:folder
\webapp\
django_app\ ←基本的な作業ディレクトリはここ(本記事では「カレントディレクトリ」はここを指す)
django_app\
__init__.py
asgi.py
settings.py
urls.py
wsgi.py
manage.py
cd ./django_app を入力して
python manage.py runserver を実行すると、Webサーバーが起動する
「http://localhost:8000」 にアクセスすると、「The install worked succeccfully! Congratulation!」というメッセージと、ロケットが飛んでいるイラストが表示される アプリケーションの作成
アプリケーションの作成には「manage.py」を使用する
python manage.py startapp アプリ名 (名前はなんでも、例えばhello)
code:folder
\webapp\
django_app\
django_app\
__init__.py
asgi.py
settings.py
urls.py ←ここでアドレス管理はおこなわない
wsgi.py
hello\ ←このフォルダ及び内部のプログラムファイルが生成される
migration
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
(urls.py) ←これは自動で作られないため、人手で作成
manage.py
コマンド実行後のディレクトリ構成↑
さらに人手で、helloディレクトリ内に「urls.py」を追加作成する
このプログラムはアプリケーション内のアドレスを管理する(どのアドレスでどのページを参照するか管理)
これをプロジェクト単位で管理すると、パスの管理が大変になる
ので、アドレスはアプリ単位で独立して管理する(各アプリ内のアドレスは独立しておこなうべし)
アプリケーションの登録
Djangoさんに「このプロジェクトにはこんなアプリケーションがあるんですよ」と伝えておく必要がある
「django_app/settings.py」を編集する
code:settings.py
※一部省略
:
:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'hello', ←これを書き足す
]
:
:
既にプログラムが書かれているので消さないように注意
作成されたプログラムファイルに必要な処理を書き足し、アプリケーションを作成する流れになる
(クイックスタート、完。)
/icons/hr.icon
超簡単なテキスト表示までの流れ
「アプリケーションの作成」で作成したhelloアプリケーションを編集し、文字列をブラウザ上で表示できるようにする
「views.py」にページ表示を書こう
以下の通りにプログラムを書き換える
code:views.py
from django.shortcuts import render
from django.http import HttpResponse
def index(requst):
return render("Hello Django!")
index関数を定義する
引数の「request」とは、クライアント側の情報をまとめた「HttpResponse」クラスのインスタンス
returnで、render関数の出力を返す
render関数は、テキスト値をレンダリングする関数である(Webページとして閲覧可能な形に変える)
(「views」という名前だが、コントローラー的役割を持つ)
「urls.py」にアクセスに関する処理を書こう
以下の通りにプログラムを書き換える
まずは「django_app」ディレクトリ内にある「urls.py」を編集する
※既に何行か自動で書かれている部分は消さない!
code:django_app/urls.py
from django.contrib import admin
from django.urls import path, include ←この処理を追加
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', include('hello.urls')), ←この処理を追加
]
「hello/」から始まるアドレスは「hello」アプリケーションのurls.pyで管理できるようになる
次に、「hello/urls.py」に処理を追加する
code:hello/urls.py
from django.urls import path
from . import views ←views.pyをインポートしている
urlpatterns = [
path('', views.index, name='index'),
]
ここに記述するのは、「http://○○/hello/」 の後に続くアドレスである
「path('', views.index), name=''index」について
「''」は暗に「http://○○/hello/」 を指す
「views.index」は、views.pyのindex関数を指す
「name='index'」は、pathにindexという名前を設定していることを表す
編集したページをブラウザから見てみよう
python manage.py runserver を実行
「Hello Django!」という文字が真っ白なWebページ上に表示されたら成功である
/icons/hr.icon
テンプレートの利用
ここでいう「テンプレート」とは、Djangoを用いてHTMLによる表示内容を操作するためのページデータのことを指す
要するに、「ただHTMLを表示するだけじゃPythonを使っている意味がないし、いちいちHTMLファイルを用意するのは面倒だ!」というので、ページの内容をPythonで上手い感じに編集して表示しようという試み
テンプレートの保存用ディレクトリを作成
django_app/helloに「templates」ディレクトリを作成
更にその「templates」ディレクトリ直下に「hello」ディレクトリを作成
テンプレートファイルはこの「django_app/hello/templates/hello」に保存
(templates直下にもう一つhelloを作成するのは、djangoがパスを間違えないようにするため)
テンプレートファイルを作成
例として「index.html」を作成する
code:index.html
<!doctype html>
<html lang=!"ja">
<head>
<meta chraset="utf-8">
<title>{{title}}</title>
</head>
<body>
<h1>{{title}}
<p>{{msg}}</p>
<p><a href="{% url goto %}">{{goto}}</a></p>
</body>
</html>
{{title}}と{{msg}}に任意のコンテンツが入るようにする
「{% url goto %}」はテンプレートタグと言われる
指定した名前のURLが書き出される
名前とは、urls.pyで指定した「name='○○'」で設定したものである
それぞれに入るコンテンツはviews.pyで設定する
views.pyを以下のように修正する
code:views.py
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
params{
'title':'indexページ',
'msg':'これは、サンプルで作ったページです。',
'goto':'next',
}
return render(request, 'hello/index.html', params)
def next(request):
params{
'title':'nextページ',
'msg':'隣のページに遷移しました',
'goto':'index',
}
return render(request, 'hello/index.html', params)
ページ遷移ができるように、urls.pyも修正する
code:urls.py
urlpatterns = {
path('', views.index, name='index'),
path('next', views.next, name='next'),
}
このようにして、htmlファイルを複数用意することなく、indexとnextのページを用意できる
テンプレートで入れ物を、views.pyでその中身を、urls.pyでページのURLを管理するという理解でおおかた大丈夫
/icons/hr.icon
フォームの利用
フォームにより、ユーザとのデータのやり取りを可能とする
データベースの利用
Djangoには、SQLiteを使用するための機能が標準搭載されている
MySQL、PostgleSQLも使用できるが、本記事ではSQLiteで話を進める
Webアプリをデプロイする
(学習が進み次第、追記予定)
使用する書籍
『Python Django超入門』 掌田津耶乃 著