親です。

子ども産まれたんで育児とかについて書きます。映画とか心理学とかITとかの趣味についても書きます。

【Python】Django基礎の基礎

おつです。Django勉強してるのでまとめる。

概要

DjangoっつーのはPythonでwebアプリ作るときのライブラリだ。代表的なライブラリにはbottleとかflaskとかがたしかあったんだけど、Djangoが一番強くて人気らしいからこれやることにした。


やってること

Djangoが何するかっていうと、まあwebページを表示させる。で、webページを表示させるってどういうことかというと、クライアントからのhttpリクエストに対してhttpレスポンスを返すことだ。ソース見てみるとアーハイハイと分かるんだけど(PyQのコード晒す)、

from django.http import HttpResponse
def index(request):
    """メイン画面."""
    title = '野菜販売'
    
    return HttpResponse('<h2>title</h2>')

これで野菜販売って書かれたwebページが表示される。まあ要するにindex関数で返却されている、

HttpResponse('<h2>title</h2>')

が表示されているわけだ。
これで基本的なDjangoのノリが分かったと思う。なんやかんやしてhtmlをhttpレスポンスとして返すんやろ?って感じ。

もうちょっと工夫したDjango

HttpResponseの引数設定
htmlを返却させるって書いたけど、いちいちHttpResponseの引数にhtml書くとしたらめっちゃだるい。ので、もちろん回避する方法がある。あらかじめ書いておいたhtmlファイルを設定することだ。
動的要素の引数設定
加えて、あらかじめ書いておいたhtmlファイルのうち一部を書き換えて表示させることもできる。んで、これらを反映させたのが下記のコード。

from django.template.response import TemplateResponse
from django.utils import timezone

from garden.models import Vegetable

name = 'ウメ'
greetings = {'morning': 'おはようございます!',
             'afternoon': 'こんにちは!',
             'night': 'こんばんは!'}


def index(request):
    """メイン画面."""
    # タイトルを作成
    title = name + 'の野菜販売'
    

    # 挨拶を取得
    now = timezone.localtime(timezone.now())  # 日本時間を取得
    greeting = select_greeting(now.hour)
    vegetables = Vegetable.objects.all()

    return TemplateResponse(request, 'garden/index.html',
                            {'title': title,
                             'greeting': greeting,
                             'vegetables': vegetables})


def select_greeting(hour):
    """挨拶を選択する"""
    if 6 <= hour < 12:
        greeting = greetings['morning']
    elif 12 <= hour < 18:
        greeting = greetings['afternoon']
    else:
        greeting = greetings['night']

    return greeting

HTMLのコードは下記。

{% load staticfiles %}
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<h2>{{ greeting }}</h2>

<img src="{% static 'garden/images/items1.png' %}" alt="野菜">
<h3>美味しい採れたての野菜</h3>
<ul>
    {% for vagetable in vagetables  %}
    <li>
        {{ vegetable.name }}
    </li>
    {% endfor %}
</ul>
<br>
<!-- この下にformを追加 -->

<!-- この下にいいね用formを追加 -->

<p>欲しい方は電話してください。</p>
<p>電話番号: 2222-XXXX</p>
</body>
</html>

HTMLとの連携部分がかなり簡単だなという印象。{}でくくってやてばいいだけ。中には{{}}だったり{% %}だったりするものもあるがこれはなんなんだろうか? けどまあ、forで野菜を並べるところとかだいぶわかりやすい。(まあでも最終的にはHTMLに埋め込まずに完全に別ファイルに書くとかになるのかな? JavaScript的発想だと)

とりま、基礎的なところはこれで終わりにする。以上。