この Lab では1~2人のクラスメートと協力することは問題ありませんが、そのグループのすべての受講生が等しく実習に貢献することが求められます。
友達の誕生日を記録するWebアプリケーションを作成します。
〆切
2021年12月31日金曜日11:59 PM (東部標準時) までに提出してください。
始め方
この実習内容をCS50 IDEにダウンロードする方法について説明します。CS50 IDEにログインし、ターミナルウィンドウで次の各コマンドを実行します。
cd
を実行して、~/
(ホームディレクトリ~
) になっていることを確認します。- Execute
wget https://cdn.cs50.net/2020/fall/labs/9/lab9.zip
を実行して、この問題のディストリビューションを含む (圧縮された) ZIPファイルをダウンロードします。 unzip lab9.zip
を実行して、そのファイルを解凍します。rm lab9.zip
を実行し、その後でyes
またはy
を実行してZIPファイルを削除します。ls
を実行します。ZIPファイル内にあったlab9
というディレクトリが表示されます。cd lab9
を実行して、そのディレクトリに移動します。ls
を実行します。application.py
ファイル、birthdays.db
ファイル、static
ディレクトリ、およびtemplates
ディレクトリが表示されます。
理解を深める
application.py
で、Flask Webアプリケーションが開始されています。アプリケーションには、POST
要求 (if
の後) とGET
要求 (else
の後) の両方を受け入れる1つのルート (/
) があります。現在、GET
でルート/
が要求されると、index.html
テンプレートがレンダリングされます。POST
経由でルート/
が要求されると、ユーザーはGET
を経由して/
にリダイレクトされます。
birthdays.db
は、id
、name
、month
、day
の4つのカラムを持つ1つのテーブルbirthdays
を持つSQLiteデータベースです。このテーブルには既にいくつかの行がありますが、最終的にWebアプリケーションはこのテーブルに行を挿入する機能をサポートします。
static
ディレクトリには、このWebアプリケーションのCSSコードを含むstyles.cssファイルがあります。このファイルの編集は必須ではありませんが、必要に応じて編集してください。
templates
ディレクトリにはindex.html
ファイルがあり、ユーザーがWebアプリケーションを表示したときにレンダリングされます。
実装の詳細
ユーザーが誕生日を保存および追跡できるようにするWebアプリケーションの実装を完了します。
GET
によってルート/
が要求されると、Webアプリケーションは、データベース内のすべてのユーザとその誕生日をテーブルに表示します。- 最初に、
application.py
に、すべての誕生日についてbirthdays.db
データベースを照会するためのロジックをGET
リクエスト処理に追加します。すべてのデータをindex.html
テンプレートに渡します。
- その後、
index.html
で、各誕生日をテーブルの行としてレンダリングするロジックを追加します。各行には2つの列が必要です。1つは名前の列、もう1つは誕生日の列です。
- 最初に、
- POST経由でルート
/
が要求されると、Webアプリケーションはデータベースに新しい誕生日を追加し、インデックスページを再描画します。- 最初に、
index.html
でHTMLフォームを追加します。このフォームには、ユーザーが名前、誕生月、および誕生日を入力できるようにする必要があります。フォームがpost
メソッドを使用して/
(その 「アクション」 ) に送信されることを確認してください。
- その後、
application.py
で、POST
リクエスト処理にロジックを追加し、ユーザから提供されたデータに基づいてbirthdaysテーブルに新しい行をINSERT
します。
- 最初に、
必要に応じて、次の操作も実行できます。
- 誕生日エントリを削除または編集する機能を追加します。
- その他、あなたの好きな機能を追加します。
ウォークスルー
ヒント
db.execute
を呼び出して、application.py
内でSQLクエリーを実行できることを思い出してください。db.execute
を呼び出してSELECT
クエリを実行した場合、関数は辞書のリストを返します。各辞書はクエリが返す1行を表します。
index.html
テンプレート内の誕生日データにアクセスできるように、index
関数のrender_template()
に追加データを渡すと便利です。tr
タグを使用して表の行を作成し、ttd
グを使用して表のデータセルを作成できることを思い出してください。- Jinjaでは、
index.html
ファイル内にfor
loopを作成できることを思い出してください。 application.py
では、request.form.get(field)
を使用して、ユーザのフォーム送信によってPOST
されたデータを取得できます。field
は、フォームからのinput
のname
属性を表す文字列です。- たとえば、
index.html
に<input name="foo" type="text">
がある場合、application.py
でrequest.form.get("foo")
を使用してユーザの入力を抽出できます。
- たとえば、
解決方法がわかりませんか?
テスト
この実習にはcheck50
はありません。ただし、誕生日を追加し、データが予想どおりに表に表示されることを確認して、Webアプリケーションをテストしてください。
ターミナルでlab9
ディレクトリにおいてflask run
を実行し、Flaskアプリケーションを提供するWebサーバを起動します。
提出方法
次のコマンドを実行し、GitHubのユーザー名とパスワードを入力してログインします。セキュリティのため、パスワードには実際の文字ではなくアスタリスク (*
) が表示されます。
submit50 cs50/labs/2021/x/birthdays