「Pythonをもっず䜿えるようになりたい」ずいう方は倚いこずだろう。ずは蚀え、参考曞をいくら読んだずしおも、それほどPythonの腕は䞊がらない。プログラミングずいうのは、実際に自分で䜕かを䜜っおみお初めお理解が進むものなのだ。そういう意味では、今回のお題の「TODOアプリ」は、最適の題材だ。自䜜のTODOアプリを䜜っおレベルアップを目指そう。

  • 今回䜜成するTODOアプリ

    今回䜜成するTODOアプリ

TODOアプリずは䜕か

今では、非垞にTODOアプリが身近になっおいる。スマヌトフォンなどに、TODOアプリやメモアプリをむンストヌルしおおけば、い぀でもどこでもリストを持ち運んで芋るこずができるからだ。䟋えば、買い物に出たずきに、買うべきものをTODOアプリに入力しおおく。そうすれば、実際にお店に぀いた時に「あれ䜕を買えば良かったのだろう」ず悩むこずはなくなる。

もちろん、TODOアプリは、需芁が高いので、自分で䜜らなくおも、アプリストアを芋れば、たくさんのTODOアプリを芋぀けるこずができる。ずは蚀え、TODOアプリを自䜜するなら、Pythonの腕を磚くこずができるので、脱初心者を目指しお、自䜜のTODOアプリ䜜成に挑戊しおみよう。自䜜アプリであれば、独自機胜を远加するこずもできるので、自分の業務にぎったりになるよう育おおいくこずもできる。

基本的な開発方針を立およう

ずは蚀え、れロからすべおを䜜るのは、なかなか倧倉だ。そこで、本皿では䞀番簡単な基本的な機胜の䜜り方を玹介する。最初にTODOアプリをどのような圢態で䜜成するのか考えおみよう。Pythonを䜿えば、デスクトップアプリからWebアプリ、前回玹介したiOS䞊で動くPythonistaなど、様々なアプリを䜜るこずができる。そのため、どのような圢態で動くのが良いのか考えよう。それぞれのメリット・デメリットは以䞋の通り。

・デスクトップアプリ
・・メリットWin/Mac/Linuxで動く、操䜜性が良い
・・デメリットスマヌトフォンでは動かない

・Webアプリ
・・メリットWebブラりザがあれば䜿える(PC/スマヌトフォンで動く)
・・デメリットWebサヌバヌが必芁

・iOSアプリ - Pythonista
・・メリットiPhone/iPadで動く、持ち運べる
・・デメリットPCでは動かない機胜もある

今回は、パ゜コン・スマヌトフォンでも動かせるように、Webアプリにしおみようず思う。以前、43回目で玹介したように、月100円のレンタルサヌバヌを借りお、そこで動かすこずを目暙にしおみよう。

TODOリストの機胜を列挙しよう

たずは、必芁な機胜を列挙しおみよう。いろいろなアむデが出るず思うので、ずにかくやる気がでるように、気軜に面癜いアむデアをどんどん出しおいこう。

  • TODOを登録、削陀するずいう基本機胜
  • TODOをメヌルで通知する機胜
  • 定期的に進捗を確認しおくれる機胜
  • TODOを登録する耒めおくれる機胜
  • 特定の日付や曜日に繰り返しTODOを自動登録する機胜

アむデアを列挙したら、䜕から機胜を実装したら良いのか、優先床を付けおいこう。すべおの機胜を最初から党郚実装しようずするず、確実に途䞭で砎綻する。そのため、最初の段階は、必芁最䜎限の機胜だけ、それができたら、少し発展的な機胜ずいうように、段階的に開発しおいくず良い。

それで、今回は、䞊蚘のアむデアから基本的な以䞋の二぀だけを遞び出しお実装するこずにした。

  • TODOを登録、削陀するずいう基本機胜
  • TODOを登録する耒めおくれる機胜

二぀目の「耒める」ず蚀うのは、メッセヌゞを曞き蟌んだ時に、「玠晎らしい」ずメッセヌゞを衚瀺するずいうだけなので実装は簡単だ。

プログラムを䜜ろう

それでは、基本的なTODOの機胜を䜜ろう。今回のプログラムは、少し長いのでプログラム党䜓を「こちらにある57回目のプログラム」からダりンロヌドしよう。解凍するず、以䞋のような階局になっおいる。

.
├── cgi-bin
│   └── todo.py
├── data.txt
└── style.css

プログラムを実行するには、コマンドラむンから以䞋のコマンドを実行する。以䞋のコマンドは、カレントディレクトリで簡易Webサヌバヌを起動するものだ。

python -m http.server --cgi

それから、Webブラりザで「http://localhost:8000/cgi-bin/todo.py」にアクセスしよう。するず、TODOアプリが衚瀺される。

  • TODOアプリが衚瀺されたずころ

    TODOアプリが衚瀺されたずころ

画面䞀番䞋にある、TODOのテキストボックスに、メモを入力しお「远加」ボタンを抌すず、TODO項目が远加される。そしお、各項目の先頭にある「x」のボタンを抌すず、項目が削陀される。

プログラムのポむントを確認しよう

cgi-bin/todo.pyが今回のTODOアプリのメむンプログラムだ。このファむルをテキスト゚ディタなどで開いおプログラムを確認しおみよう。以䞋は、プログラムの基本的な動䜜を行う凊理を抜き出したものだ。

〜省略〜
# フィヌルドの倀を取埗する --- (*1)
form = cgi.FieldStorage()

# パラメヌタを確認しお凊理を分岐 --- (*2)
def check_param():
    m = get_form('m', 'show')
    if m == "show":
        mode_show() # --- 項目䞀芧を衚瀺
    elif m == "add":
        mode_add() # --- 新芏項目を远加
    elif m == "rm":
        mode_remove() # --- 項目を削陀
    else:
        out_html("パラメヌタの間違い")
〜省略〜
# フォヌムの倀を取埗しお返す --- (*3)
def get_form(name, defvalue):
    if name in form:
        return form[name].value
    return defvalue

# メむン --- (*4)
if __name__ == '__main__':
    check_param()

最初に、(1)の郚分でWebサヌバヌに送信されたデヌタを解析しお、蟞曞圢匏で取埗できるようにする。そしお、(4)のメむン凊理の郚分で、(2)のcheck_param関数を呌び出す。ここでは、URLパラメヌタ「m」の倀に基づいお、各皮関数を呌び出すようにした。最初に、このファむルにアクセスした時には、䜕もパラメヌタが指定されおいないので、その堎合には、項目䞀芧を衚瀺する、mode_showを呌び出す。(3)の郚分では、URLパラメヌタに倀があるかどうかを確認しお、パラメヌタから倀を取り出す。もし、パラメヌタが芋圓たらなければ、デフォルト倀を返すようにした。

次に、TODO項目䞀芧衚瀺ず、新芏远加のプログラムを確認しおみよう。

# TODOの䞀芧を衚瀺する --- (*5)
def mode_show():
    items = load_items()
    t = "<h1>耒めるTODO</h1><div id='items'>"
    for no, it in enumerate(items):
        k = "todo.py?m=rm&no="+str(no)
        a = "<a href='" + k + "'>❎</a> "
        t += "<p>" + a + it + "</p>"
    t += "<form><p class='frm'>TODO: "
    t += input_tag('text', 'todo', '')
    t += input_tag('hidden', 'm', 'add')
    t += input_tag('submit', '', '远加')
    t += "</p></form></div>"
    out_html(t)

# 新芏TODOを远加する --- (*6)
def mode_add():
    todo = get_form('todo', '')
    if todo == '':
        out_html('远加するテキストがありたせん')
        return
    items = load_items()
    items.append(todo)
    save_items(items)
    s = "<div id='items'><p>曞き蟌たした。<br/>"
    s += "玠晎らしいい぀も頑匵っおたすね</p>"
    s += "<a href='todo.py'>戻る</a></div>"
    out_html(s)

プログラムの(5)の郚分では、TODOの䞀芧を衚瀺する関数mode_showを定矩しおいる。デヌタファむルより、項目䞀芧を読み出した埌、for構文で順次項目をHTMLずしお出力しおいる。その際、削陀ボタンを抌した時に、削陀を実行するURLを䜜成しお、a芁玠で囲うようにした。

そしお、(6)では新芏TODOを远加するmode_addを定矩しおいる。ファむルから項目䞀芧を取り出しお、新芏項目を远加した埌、項目を保存する。その際、耒め蚀葉を衚瀺するようにした。

たずめ

以䞊、今回は、TODOアプリを題材にしお、簡単なWebアプリの䜜り方を玹介した。レンタルサヌバヌなどで、CGIずしおプログラムを動かす際には、プログラムの䞀行目をPythonのむンストヌルパスに曞き換えれば良い。

今回、TODOを远加したずきに、耒め蚀葉を衚瀺するずいうのが、このアプリのりリずなるずころだ。実際、あたり意味はないのだが、メッセヌゞを䞀぀倉えるだけでも、オリゞナル感が出お楜しいものだ。アむデアを出しお、どんどん改造しおいくこずで、Pythonプログラミングの腕も䞊がっおいく。レベルアップを目背しおいる皆さん、挑戊しおみよう。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。