この Lab では1~2人のクラスメートと協力することは問題ありませんが、そのグループのすべての受講生が等しく実習に貢献することが求められます。
友達の誕生日を記録するWebアプリケーションを作成します。
始め方
VS Codeを開きます。
ターミナルウィンドウ内をクリックすることから始めて、それからcd
を実行します。
その後プロンプトは次のようになっていることがわかります。
$
ターミナルウィンドウの内側をクリックし、次のように入力します。
wget https://cdn.cs50.net/2021/fall/labs/9/birthdays.zip
その後にEnterを押すと、birthdays.zipというZIPがあなたのCodespaceにダウンロードされます。wgetと次のURLの間にあるスペースや、その他の文字を見落とさないように注意してください。
次に
unzip birthdays.zip
を実行して、birthdaysというフォルダを作成します。
ZIPファイルは不要になったため、
rm birthdays.zip
を実行し、プロンプトで “y “に続いてEnterで応答すると、ダウンロードしたZIPファイルが削除されます。
次に
cd birthdays
の後にEnterを押して、そのディレクトリに移動する(つまり、開く)。これでプロンプトは以下のようになります。
birthdays/ $
すべて成功した場合は、次のように実行します。
ls
次のファイルとフォルダが表示されます。
app.py birthdays.db static/ templates/
問題が発生した場合は、同じ手順をもう一度実行して、どこが間違っていたかを判断できるかどうかを確認してください。
理解を深める
app.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アプリケーションは、データベース内のすべてのユーザとその誕生日をテーブルに表示します。- 最初に、
に、すべての誕生日についてapp
.pybirthdays.db
データベースを照会するためのロジックをGET
リクエスト処理に追加します。すべてのデータをindex.html
テンプレートに渡します。
- その後、
index.html
で、各誕生日をテーブルの行としてレンダリングするロジックを追加します。各行には2つの列が必要です。1つは名前の列、もう1つは誕生日の列です。
- 最初に、
- POST経由でルート
/
が要求されると、Webアプリケーションはデータベースに新しい誕生日を追加し、インデックスページを再描画します。- 最初に、
index.html
でHTMLフォームを追加します。このフォームには、ユーザーが名前、誕生月、および誕生日を入力できるようにする必要があります。フォームがpost
メソッドを使用して/
(その 「アクション」 ) に送信されることを確認してください。
- その後、
で、app
.pyPOST
リクエスト処理にロジックを追加し、ユーザから提供されたデータに基づいてbirthdaysテーブルに新しい行をINSERT
します。
- 最初に、
必要に応じて、次の操作も実行できます。
- 誕生日エントリを削除または編集する機能を追加します。
- その他、あなたの好きな機能を追加します。
ウォークスルー
このビデオは、コースがまだコードを書くためにCS50 IDEを使用していたときに記録されたものです。インターフェイスはあなたのCodespaceと異なるように見えますが、2つの環境の動作はほぼ同じであるはずです。
ヒント
db.execute
を呼び出して、
内でSQLクエリーを実行できることを思い出してください。
.pyapp
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">
がある場合、
で
.pyapp
request.form.get("foo")
を使用してユーザの入力を抽出できます。
- たとえば、
解決方法がわかりませんか?
テスト
この実習にはcheck50
はありません。ただし、誕生日を追加し、データが予想どおりに表に表示されることを確認して、Webアプリケーションをテストしてください。
ターミナルでbirthdays
ディレクトリにおいてflask run
を実行し、Flaskアプリケーションを提供するWebサーバを起動します。
提出方法
ターミナルで、以下のコマンドを実行して提出してください。
submit50 cs50/labs/2022/x/birthdays