Help us understand the problem. What is going on with this article?

Djangoで投稿アプリを作ってみる②(最初の Viewを表示)

More than 1 year has passed since last update.

学習履歴

■前回の復習

Djangoで投稿アプリを作ってみる①(プロジェクト作成、http / https 通信許可)では、
Django のプロジェクトの作り方、http / https 通信を許可するための設定方法を学んだ。

今日もその続きをやっていこうと思う。

■投稿アプリ rabbit 開発

1.nginx のレスポンスを 200 に変更

ちょっと脇道にそれるけど、Webサーバにリクエストを送ったとき、
返却される値にステータスコードがある。

参考:ステータスコード

このステータスコードは、Chrome だと F12 を押下して、Network タブから
確認できるが、サーバ構築_サクラVPSのWebアプリケーションサーバ構築で、設定した
nginx の設定ファイルだと 304 が返されてしまうんだ。

statuscode.png

https を有効化した理由は、セキュアな通信を行う以外にも Line botなどの
Web API を利用するときに https でないと利用できないものもあるからだ。

Line bot は、さらにステータスコードが、200 でないと利用できない縛りもある。

将来のことを見越して、200 が返却されるように nginx の設定を追加しようと思う。

rabbit.conf
$cd /etc/nginx/conf.d #{nginxの設定値を格納した場所に移動}
$vim example.conf #{nginx の設定値を変更}

server {
        listen 80;
        server_name {サーバー名};
        access_log /var/log/nginx/static-access.log;
        error_log /var/log/nginx/static-error.log;

        location / {
                root /www/dir;
                index index.html index.htm;
                return 200; #{追加}
        }
}
server {
        listen 443;
        ssl on;
        server_name {サーバ名};
        ssl_certificate /etc/httpd/conf/ssl.crt/server.crt;
        ssl_certificate_key /etc/httpd/conf/ssl.key/server.key;
        access_log /var/log/nginx/static-access.log;
        error_log /var/log/nginx/static-error.log;

        location / {
                root /www/dir;
                index index.html index.htm;
                return 200; #{追加}
        }
}

$systemctl restart nginx #{nginx 再起動}

`#{追加} の部分が今回追加した設定だ。
設定が終わったら nginx を再起動して設定を有効化し、ステータスコードを
確認してみよう。(画面をリフレッシュすることを忘れずに)

statuscode_200.png

大丈夫みたいだ。

TEST PAGE という文字は消えてしまったけど、とりあえず、200 を確認できた。

nginx の設定にある index ディレクティブは、指定したディレクトリに
アクセスしたときにレスポンスに使用されるファイルを指定する。

今回は、index.html index.htm を指定してたので、今まではそのファイルが存在し
かつ、しばらく変更されていなかった場合、304 を返し、index.html の中身を
画面に表示させていた。

しかし、今回の設定で、レスポンスが 200 のみを返すように変更したので、
index.html の中身は表示されなくなったと理解している。
(間違ってたらごめん)

ちなみに、return 200 "ok" と記述すると画面上には、ok が表示される。

2. Cyberduck のインストール

これも脇道にそれるんだけどCyberduckをインストールしておこう。

ローカルで編集したプログラムをさくらの VPS 上にデプロイしてるが、
いちいちサーバにアクセスしてファイルを格納することはとてもめんどくさい
作業だ。

この Cyberduck は、FFFTP みたいにサーバへファイルを転送できるツール
なんだけど、特徴的なのが Cyberduck 上で好きなエディタを選択して、
ファイルの編集が行えることだ。

そして、ファイルを保存するとサーバへファイルが送信され、自動で
デプロイしてくれる大変便利なツールだ。

自動デプロイの方法で、もっと便利なものがあるかもしれないけど、
今は、これで充分だと思う。

3. polls アプリケーションの作成

色々と脇道にそれたけど、これからアプリケーションを作っていく。
Django のバージョンは、2.0

まずは、小手調べに公式サイトの polls アプリケーションを写径していこうと思う。

構築したさくらの VPS がちゃんと動くかの動作確認と
Django アプリケーションの作り方を覚える必要がある為だ。

ただし、随時変更を入れていく予定だ。
(脇道にもそれる)

例えば、DB は、PostgreSQL を使って作業していく。

manage.py と同じディレクトリに移動後に以下のコマンドを打って
polls アプリケーションを作成してほしい。

$python3 manage.py startapp polls

tree コマンドを打つと、polls アプリケーションが作成されている
ことがわかる。

|-- db.sqlite3
|-- manage.py
|-- polls
|   |-- __init__.py
|   |-- admin.py
|   |-- apps.py
|   |-- migrations
|   |   `-- __init__.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py
`-- rabbit
    |-- __init__.py
    |-- __pycache__
    |   |-- __init__.cpython-36.pyc
    |   |-- settings.cpython-36.pyc
    |   |-- urls.cpython-36.pyc
    |   `-- wsgi.cpython-36.pyc
    |-- settings.py
    |-- urls.py
    `-- wsgi.py

4. View を作ろう

Web ブラウザに文字を表示させるための View を作くろう。

最初に polls フォルダの配下に urls.py を作成しておこう。

$cd polls
$touch urls.py

tree で表示させると polls 配下に urls.py が作成されていることがわかる。

それと、tree コマンドで度々ディレクトリ階層を表示させてるけど、
Django は、ファイル間の連携がすごく重要なので表示させているんだ。

View の作成においても、polls/views.py, polls/urls.py,
rabbit/urls.py の編集が必要なので、どこで何をすべきかわからなく
ならないように随時確認しよう。

rabbit
|-- db.sqlite3
|-- manage.py
|-- polls
|   |-- __init__.py
|   |-- admin.py
|   |-- apps.py
|   |-- migrations
|   |   `-- __init__.py
|   |-- models.py
|   |-- tests.py
|   |-- urls.py ★
|   `-- views.py ★
`-- rabbit
    |-- __init__.py
    |-- __pycache__
    |   |-- __init__.cpython-36.pyc
    |   |-- settings.cpython-36.pyc
    |   |-- urls.cpython-36.pyc
    |   `-- wsgi.cpython-36.pyc
    |-- settings.py 
    |-- urls.py ★
    `-- wsgi.py

あと、これだけのファイルを編集するとなると vim じゃ厳しいので、
Cyberduck を使って開発を進めていくことにする。

rabbit/urls と polls/urls は、アプリケーションの URL の情報が
記述されるファイルで、polls/views.py は、画面表示の操作を行う為の
ファイルだ。

Django は、ユーザがアクセスしてきたらまず、
1. rabbit/urls の urlpatterns を確認 (polls の url を発見)
2. polls/urls の urlpatterns を確認 (polls の views を発見)
3. views 自身が画面表示を行うか、画面テンプレートへリダイレクト
みたいな動きをする。

実際にコードを書いてみよう。

rabbit/urls.py
from django.contrib import admin
from django.urls import path, include #{追加}

# ユーザのリクエストがあったら Django は、urlpatterns 内の
# アプリへのパスをインクルードする
urlpatterns = [
    # include で polls アプリケーションのパス情報を読み込む
    path('polls/', include('polls.urls')), #{追加}
    path('admin/', admin.site.urls),
]
polls/urls.py
from django.urls import path

from . import views

# url に何も指定しない場合は、views.py の index を表示する設定
urlpatterns = [
    path('', views.index, name='index')
]
polls/views.py
from django.shortcuts import render

from django.http import HttpResponse #{追加}

# web ブラウザ上に表示
def index(request):
    return HttpResponse("This page is first View Page.") #{追加}

polls/urls.py 以外は、Django が作成してくれるので、`#{追加}と
記述したところが追加したコードだ。

Django のサーバを起動させてから https:******com:8000/polls へ
アクセスしてみよう。

https に対応させてるので、サーバの起動コマンドは以下だ。

python3 manage.py runsslserver 0.0.0.0:8000 --certificate (サーバ証明書) --key (秘密鍵)

例)
python3 manage.py runsslserver 0.0.0.0:8000 --certificate /etc/httpd/conf/ssl.crt/server.crt --key /etc/httpd/conf/ssl.key/server.key

http を使いたい場合の起動コマンドは以下になる。

python manage.py runserver 0.0.0.0:8000

views.png

最初は正直、何やってるのか意味が分からなかったけど
色々とコードをいじってたら理解してきた。

例えば、さっき記述した include('polls.urls') だが、これを一つ書いておけば、
polls 内で Veiw を増やしても rabbit 側で細かく指定する必要がない。

例えば、以下の View にアクセスしたい場合のファイルの編集について考えてみよう。

https:******com:8000/polls/post
https:******com:8000/polls/postdate
https:******com:8000/polls/allpost

さっき作成した poll/urls.py にコードを追加してみる。

polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('post', views.post, name='post'),
    path('postdate', views.postdate, name='postdate'),
    path('allpost', views.allpost, name='allpost'),
]

views.post の指定は、views.py の def で設定した post を指定している。

path('urlの階層名', views.py の 関数名, rabbit 内でアクセスする名前)

url の階層名は、include('polls.urls') により rabbit が polls/****
として認識してくれるから階層名だけ書けばいいと理解している。
(間違ってたらごめん)

views.py の編集は以下の様になる。

polls/views.py
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("This page is first View Page.")

def post(request):
    return HttpResponse("This page is first Post Page.")

def postdate(requets):
    return HttpResponse("This page is first postdate Page.")

def allpost(request):
    return HttpResponse("This page is first allpost Page.")

これだけで、上記の URL にアクセスできるようになったはずだ。

views.png

長くなったので、本日はここまでにしようと思う。

最後に post と postdate と allpost は、いらないので削除してから
PC を閉じよう。

まとめ

・ステータスコード 200 の出し方を勉強した
・Cyberduck を紹介した。
・polls アプリを作成し、最初の View を表示させた。

__init__
PythonとGo言語が一番好きです。どちらも仕事で使っています!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away