はじめに
クジラ飛行机、 杉山 陽一、遠藤 俊輔 著「PythonでつくるWebアプリのつくり方」を読み,Pythonを使ったWebアプリ開発の基礎を学ぶことにした。
本記事は,「chapter4 実践Webアプリを作ってみよう」における,カレンダーアプリに関する読書メモである。
02 カレンダーアプリを作ってみよう
要点
calendarモジュール
本節では,Pythonのcalendarモジュールを用いたカレンダーの作成方法について説明している。
calendarモジュールは,一般的なカレンダーに関する機能群を提供している。特に,calendar.HTMLCalendarクラスは,HTMLのカレンダーを作成するためのクラスである。
iCal形式の出力機能
「iCal(iCalendar)」形式は,拡張子が「.ical」や「.ics」のファイル形式であり,Google CalendarやApple Calendarなどが入出力に対応している。
iCalのデータは以下のような構造になっている。
BEGIN:VCALENDAR VERSION:2.0 PRODID: calendar_events BEGIN:VEVENT DTSTART;VALUE=DATE:20240820 DTEND;VALUE=DATE:20240820 SUMMARY:Dランドに行く END:VEVENT ... END:VCALENDAR
- カレンダー全体は,BEGIN:VCALENDAR~END:VCALENDARの範囲で定義される。
- 1つのイベントは,BEGIN:VEVENT~END:VEVENTの範囲で定義される。
- 複数のイベントがある場合は,BEGIN:VEVENT~END:VEVENTが繰り返される。
という形式になっている。
本節の気付き : シンプルなカレンダー
シンプルなカレンダーアプリを実行すると,以下のように表示される。

このカレンダーをHTMLで出力する部分は,
html = calendar.HTMLCalendar().formatmonth(year, month)
のように,年と月を指定することで出力できる。
本節の気付き : 予定の書き込みができるカレンダー
エンコードの指定
本書のP196を参考に,ソースコードのsrc\ch4\calendar_events.py を動かそうとしたところ,以下のようなエラーメッセージが表示された。
Traceback (most recent call last):
File "c:\workspace_python\flask_workspace\src\ch4\calendar\calendar_events.py", line 12, in <module>
events = json.load(f)
^^^^^^^^^^^^
File "C:\Users\yosch\AppData\Local\Programs\Python\Python312\Lib\json\__init__.py", line 293, in load
return loads(fp.read(),
^^^^^^^^^
UnicodeDecodeError: 'cp932' codec can't decode byte 0x87 in position 69: illegal multibyte sequenceエンコーディングのエラーを起こしていたので,以下のようにイベントデータのjsonファイルの読み込みの際にエンコードを指定するように修正してみた。
- 修正後
# イベントデータをファイルから読む --- (※2) events = {} if os.path.exists(SAVE_FILE): #with open(SAVE_FILE, "r") as f: with open(SAVE_FILE, "r", encoding="utf-8") as f: events = json.load(f)
その結果,無事にカレンダーが表示された。

まとめと感想
今回は,「chapter4 実践Webアプリを作ってみよう」における,カレンダーアプリについてまとめた。
pythonのcalendarライブラリを使うことによって,カレンダーを計算するだけでなくHTMLで出力できるというのはとても驚いた。カレンダーアプリを作る機会は少ないと思うが,開発したアプリの中で日付や時刻情報を管理したいときはあると思うので,その際にはこのライブラリを活用したい。
JSON形式で保存された予定表を読み込むときには,エンコーディングが問題になった。ファイル読込みが発生する際には,エンコードに気を遣うようにしたい。
本記事を最後まで読んでくださり,どうもありがとうございました。