djangoを使って「hello world」をブラウザに表示させてみましょう。
完成イメージはこのような感じです。
普通のウェブサーバーを使うのであれば、「hello world」をindex.htmlファイルに書けば、ブラウザで表示させることが可能です。
これは、ブラウザが直接index.htmlファイルを取りにいき、その内容を表示しているからです。
こんなイメージですね。
djangoの場合、ブラウザとhtmlファイルの間で色々な処理が行われます。
これもイメージをのせますね。
詳細は順番に説明していきますが、ブラウザに何か表示されるまでに多くの処理がされている。というイメージを持つと良いでしょう。
この点についてさらに具体例で解説をしています。さらにイメージをふくらませてたい人は、普通のウェブサイトと、Djangoの違いを解説【具体例で説明します】という記事を読んでみて下さい。
プロジェクトフォルダの作成
早速djangoを使ってhello worldを表示させていきましょう。
まずは、django関連のファイルを入れるためのフォルダを作ります。
このフォルダは、普段仕事をする上でファイルを管理する時に使うフォルダと同じです。
例えば、「A案件」、「領収書」といった形でフォルダを分けるようなイメージです。
djangoでもプロジェクト毎に(サイト毎に)フォルダを作って管理します。
コマンドライン$ cd ~
$ mkdir djangoproject
$ cd djangoproject
「cd~」は、ホームディレクトリ(Windowsで言うとデスクトップのような場所)に移動させるためのコマンドです。
今回は「djangoproject」という名前のプロジェクトフォルダを作りました。
cdコマンドでdjangoprojectフォルダに移動し、このフォルダの中でdjangoプロジェクトを作っていきます。
コマンドライン$ django-admin startproject helloworld
この「django-admin startproject」というコマンドは、djangoで使うファイルやフォルダをまとめてフォルダにコピーするためのコマンドです。
上記のコマンドの最後にhelloworldという名前を付けましたので、djangoprojectフォルダの中に「helloworld」というフォルダができます。
helloworldフォルダに移動しましょう。
コマンドライン$ cd helloworld
すると、このようなフォルダ構成を確認することができます。
コマンドラインhelloworld
__init__.py
settings.py
urls.py
wsgi.py
manage.py
これで、djangoプロジェクトは無事にインストールできていました。
それぞれのファイルが何を意味するのかは追って説明していきますので安心して下さい。
ウェブサーバーを立ち上げてみる
djangoには多くの機能があります。その一つの目的は、エンジニアが簡単に開発をすることができるようにすることです。
たとえば、Djangoでは開発を進めるにあたって便利な機能の一つとして、ウェブサーバーが備え付けられています。
普通はapachやnginxといったプログラムがインストールされたサーバー(ウェブサーバー)を準備し、そのウェブサーバーの中にhtmlファイルを入れなければいけないのですが、djangoではこのウェブサーバーとして機能が予め備え付けられています。
補足ウェブサーバーの補足説明:ウェブサーバーがやっていることは、リクエスト(Aという名前のファイルください!というイメージ)を受け取り、レスポンス(お返しします!)を返すことです。
レスポンスを返すためには、リクエストを受け付けるための準備が整っている必要があります。
このリクエストを受ける準備を整えることができるのがウェブサーバーです。
早速、Djangoに備え付けられているウェブサーバー機能を使ってみましょう。
ウェブサーバーを立ち上げるには、「manage.py runserver」というコマンドを打ちます。
コマンドライン$ python manage.py runserver
manage.pyはdjangoに組み込まれている特定の命令を実行するために使われます。
例えば、ターミナルで「sample.py」というパイソンファイルを実行するためには、「python sample.py」とコマンドを打ちますよね。
manage.pyも同じようなイメージです。
manage.pyでできることは、追って紹介していきますので、まずは「manage.py」というコマンドによってdjangoの便利な機能を使うことができる。というイメージを持ちましょう。
「manage.py runserver」コマンドを実行した結果、ターミナルに以下のような表示がされると思います。
コマンドラインDjango version 2.1, using settings 'sample.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
これは、django(Python)がウェブサーバーを立ち上げてくれたことを意味しています。
ターミナルに書かれている内容は、「http://127.0.0.1:8000/で開発用のウェブサーバーを立ち上げました。」というものです。
127.0.0.1というのはあなたのパソコンの(デフォルトでの)ipアドレスです。そして、右側の8000というのがポート番号です。
実際に、ブラウザにhttp://127.0.0.1:8000/と打ってみましょう。
以下のような画面が表示されました。ここには、djangoがあらかじめ準備している画面(html)が表示されます。
なお、127.0.0.1はローカルホストとも呼ばれているのですが、ローカルホストについて詳しく知りたい方は、localhostについて詳しく解説【具体的に解説します】という記事を読んでみて下さい。
Hello worldを出力させる
djangoプロジェクトでウェブサーバーを立ち上げることができました。
次に、この画面(http://127.0.0.1:8000/)にhello worldが出力されるようにしていきましょう。
まず、コマンドライン上で<Ctrl-c>を押し、ウェブサーバーを停止します。
停止したら、helloworldフォルダに移動します。
helloworldフォルダには以下のファイルが入っていることをおさらいしましょう。
フォルダ構成-BASE/helloworld
__init__.py
settings.py
urls.py
wsgi.py
ここで、それぞれのファイルの意味について簡単にみていきましょう。
補足__init__.pyは、djangoを便利に使うための初期設定ファイルです。
settings.pyはdjangoの設定ファイルが入っています。具体的には、言語を選んだり、アクセスを許可するIP(url)の設定などができます。
urls.pyは、表示するurlの指示を受けた時に(httprequestを受けたときに)djangoが次にどのファイルを参照するのかを決める時に使います。
wsgi.pyは、アプリとサーバーの間を取り持つ役割を果たします。
どれも抽象的でわかりづらいと思いますので、まずは雰囲気だけ感じとってもらえれば大丈夫です。
djangoの仕組みをイメージで理解する
ここで、イメージを膨らませるために、djangoの仕組みをイメージを使って理解していきましょう。
ブラウザからリクエストが送られると、djangoはそのurlをみた上で、urls.pyファイルに書かれている内容と照らし合わせ、合致する内容に応じ、views.pyの中の何をよびだすのかを指定します。
view.pyには、どういった形でブラウザにresponseを返すのかという情報がまとめられており、その情報にもとづいてdjangoの内部で処理がされ、responseがブラウザにもどります。
今回の例では、http://127.0.0.1:8000/でリクエストが送られると、urls.pyがviewsの中から「hello world」を表示するresponseが書かれている内容をよびだすよう指示します。
つまり、views.pyファイルで該当する内容に「hello world」が表示されるよう設定しておけば、ブラウザにhello worldが書かれたresponseが戻り、ブラウザにhello worldが表示される、という仕組みです。
つまり、これからはurls.pyファイルをviews.pyファイルを設定していく必要があります。順番に設定を進めていきましょう。
urls.pyファイルの設定
まずはurls.pyファイルの設定からです。
urls.pyファイルを開いてみましょう。コメントをのぞくと、以下のようなコードが確認できます。
コードBASE/hello/urls.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
ここでのポイントは、urlpatternsの部分です。
あるurlがリクエストされた時に、次に何を表示するのかをここで制御しています。
ちなみに、path('admin/', admin.site.urls)というのは、127.0.0.1:8000/adminというurlがリクエストされたら、次にadmin.site.urls(管理画面)を表示する、という指示をしています。(これは若干高度な内容なので、まずはざっくりとした理解で大丈夫です。)
このurls.pyに一行追加します。
コードBASE/hello/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', views.helloworld), ← new!
]
path('hello/', views.helloworld)について、くわしくみていきましょう。
このコードは、127.0.0.1:8000/hello/というurlがブラウザからリクエストされた時に、views.helloworldを表示する、という指示をしています。
ただ、views.helloworldが何を示しているのか分からないですよね。
これは、「view.py」ファイルの中の「helloworld関数を実行しなさい」と指示しています。
ちなみに、今回はviewsがファイルでhelloworldが関数でしたが、これが何を意味するのかは状況によって異なります。
なぜなら、これらは(helloworldは)属性である場合もあれば、メソッドである場合もあるからです。
(これはパイソンの内容ですが、詳しく理解したい場合はクラスという記事を読んでみるとよいかもしれません。)
helloworldの中にviews.pyというファイルはありませんので、views.pyファイルを作っていきましょう。
コマンドラインBASE/helloworld
$ touch views.py
views.pyファイルができました。
作った後に、このファイル(views.py)を開いてみましょう。
開くと、もちろんコードは何も書かれていません。
ただ、さきほどurls.pyファイルの中で、http://127.0.0.1:8000/hello/がリクエストされると、view.pyファイルの中のhelloworld関数を呼び出すとしましたので、実際にhelloworld関数を作っていきましょう。
コード-BASE/hello/views.py
def helloworld(request):
return HttpResponse('<h1>hello world</h1>')
requestはブラウザから送られたHttpRequestにもとづいて作られたオブジェクトです。Httprequestに関連するたくさんの情報が入っているオブジェクトというイメージを持ちましょう。
ちなみに、djangoでは、viewを適切に表示するためには、関数の第一引数としてrequestを取らなければいけません。
そして、このhelloworldメソッドはHttpResponseオブジェクトを返すよう指示しています。
HttpResponseオブジェクト(クラス)はコンストラクタを持っており、オブジェクトを作成したときに渡した文字列(今回の場合は<h1>hello world</h1>)をブラウザに返します。
このように、無事にhello worldが出力されていることが確認できました。
なお、このようにviews.pyファイルにおいて、関数を使ってブラウザに表示させる内容を管理する方法をfunction based viewといいます。
これに対し、クラスを作ってブラウザに表示させる内容を管理する方法もありますが、これはclass based viewといいます。
また、結局のところ、Djangoがやっていることはリクエストを受け取って、レスポンスを返す。ということをしているだけです。
class based viewは次の記事で詳しく解説しています。
まとめ
(1) プロジェクトを作るには、django-admin startproject プロジェクト名というコードを打つ
(2) urls.pyはリクエストを受けた時に、urlに応じて何を表示させるかを指示する。
(3) views.pyは実際に表示する中身を書く
(4) requestや、HttpResponseなど、djangoには予めそなえられた便利なオブジェクトが沢山ある。
次の記事
function based viewではなく、class based viewで同じくhello worldを表示していきます。
class based viewという記事をみていきましょう。