DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

Django奮闘記④情報の行方ーviewsとurlsの理解ー

前回からこちらのチュートリアルを参考に奮闘記を綴っています。

はじめての Django アプリ作成、その2 | Django documentation | Django

とりあえずサンプル通りには動くようになりました。 

dreamerdream.hateblo.jp

 

ここまでの理解

  • Djangoはプロジェクト単位で管理する。
  • アプリはプロジェクト内のディレクトリに纏められる。
  • アプリはアプリごとにディレクトリに整理されている。
  • プロジェクトはやアプリケーションはデータベースによって管理される。
  • 新しくアプリを作ったらmigratationでアプリがデータベースに登録される。
  • 管理ページは自動作成される。

 

理解が進んでいないとこ

  • viewやらurlやらは細かく手動で紐付ける必用がある。(アクセスされてから全体の流れが理解できていない)
  • Bottleのようにテンプレートを利用する方法。

 

今回の目的はまずviewsとurlsの使い方を理解する。

しかしまあ、参照サイトが技術者向けといいますか、Web開発慣れした人が読んだらすぐ理解出来るのだろうけど、僕みたいな素人には理解出来ない用語もあるので少し違う記事にも目を向けて、こちらの記事が素人でも理解し易かったのでこちらの記事も参考にしながら流れを読んでいきました。

Django2.0入門: 初心者でも10分でWebサービスを作れる!PythonフレームワークDjangoとPaizaCloudの使い方 - paiza開発日誌

で、掴んだ全体の流れは、

(私的考察なので読んでいただく必要はありません)

アプリ内、views.pyファイルにHttpResponse(’〜内容〜’)と書くとをのまま書いたものを表示する。

このファイルの内容をviews関数として扱っている。

viewsにはindexやdelateやcreateといった関数を用意して各関数に機能を持たせることが出来る。(ここがアプリ的な動作)

 

アプリ内、urls.pyというファイルにurlpatterns=[path(),]という記述の通りにアプリ内部のアクセスをviewsに振り分けている。

例)views.indexと書くと先ほどのviews.pyファイル内のindex関数が呼ばれる。

 

プロジェクト自体のアクセス先の振り分けはプロジェクト先頭のurls.pyが担っている。

こちらで

urlpatterns=[path('アプリのアドレス指定で入って来たものを','先ほどのアプリ内urls.pyに振り分ける'),]

RedirectViewを利用するとリダイレクトするという指定も可能。

 

プロジェクト名のsettig.pyでアプリケーションの登録をすることでアプリが利用できるようになる。

 

つまり、最初にプロジェクトのurls.pyが呼ばれ、urls.pyの指定通りに各アプリのurls.pyに振り分け、各アプリのurls.pyの指定通りにviews.pyの関数が呼ばれる。という流れになるのですね。

 

 

さて、元の参考サイトの続きを見て試していきます。

はじめての Django アプリ作成、その 3 | Django documentation | Django

raspberrypi:~/dreamer $ nano polls/views.py

polls/views.pyをサイトの通りに編集します。

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")

def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)

def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)

def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)

 

つまり、アドレスによって引数として渡されたquestion_idをそのまま文字列にして表示するというわけですね。

これがうまくいけば、きちんと引数が狙ったところに渡っているという証拠になります。

raspberrypi:~/dreamer $ nano polls/urls.py

polls/urls.pyで渡すviews関数を記載します。

from django.urls import path

from . import views

urlpatterns = [
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]

 

アクセスすると

f:id:DreamerDream:20180903131233p:plain

f:id:DreamerDream:20180903131249p:plain

f:id:DreamerDream:20180903131302p:plain

きちんと引数としてURLを渡してくれています。

文字を試してみましたら、これはダメそうです。

f:id:DreamerDream:20180903132535p:plain

おそらく、viewsで<int:question_id>と指定しているからint型でしか渡せないということでしょう。

ということで、試しに

raspberrypi:~/dreamer nano polls/urls.py

を編集してint型指定をstr型に変えてみます。(変わるのかは不明だけど)

path('<str:question_id>/', views.detail, name='detail'),

f:id:DreamerDream:20180903133059p:plain

strなら文字列も渡せるようです。

日本語も大丈夫なようです。

f:id:DreamerDream:20180903133341p:plain

なるほど!こうやってリクエストを渡せるのですね!

<参照サイトhttps://docs.djangoproject.com/ja/2.1/intro/tutorial03/から引用>

ビューはデータベースからレコードを読みだしても、読み出さなくてもかまいません。 Django のテンプレートシステム、あるいはサードパーティPython テンプ レートシステムを使ってもよいですし、使わなくてもかまいません。 PDF ファイルを生成しても、 XML を出力しても、 ZIP ファイルをその場で生成してもかまいません。 Python ライブラリを使ってやりたいことを何でも実現できます。

Django にとって必要なのは HttpResponse か、あるいは例外です。

viewsに渡した値はpythonで自由に使えるということなのですね!

意味が解って来ましたヨッ!

 

次回は 

テンプレートを使ったサンプルを動かしてみます。

dreamerdream.hateblo.jp

 

kampa.me