組み込み開発のためのPython · レッスン 127 / 238

Django Tutorial:最初のWebアプリ

DjangoはURL、ビュー、テンプレート、モデルなどを組み合わせてWebアプリを作るフレームワークです。開発環境を分離し、リクエストからレスポンスまでの流れを理解します。

DjangoはURL、ビュー、テンプレート、モデルなどを組み合わせてWebアプリを作るフレームワークです。開発環境を分離し、リクエストからレスポンスまでの流れを理解します。 仕組みだけでなく、検証方法と運用上の注意も具体例で確認します。

Djangoを使う目的

DjangoはPythonでWebアプリケーションを構築するためのフレームワークです。URLの解決、ビュー、テンプレート、データモデル、管理機能など、Webアプリに共通する仕組みを一貫した設計で提供します。小さなデモでも、開発用サーバーと本番運用を区別し、外部入力の検証やアクセス制御を考えてください。Djangoの版により設定や推奨方法が変わるため、学習時に使う版と公式ドキュメントを合わせます。フレームワークが安全機能を提供しても、誤った設定や未検証の処理が安全になるわけではありません。目的と運用条件を明確にしてから構築を始めましょう。

仮想環境とプロジェクトの初期化

Djangoを導入するときはプロジェクト用の仮想環境を作り、依存パッケージを他のアプリから分離します。インストール後にpython -m django --versionを実行し、想定した環境に入っているか確かめてください。startprojectは設定やルートURLなどを含むプロジェクトを作成し、manage.pyは開発コマンドを実行する入口になります。カレントディレクトリを間違えると別の場所へ生成するため、実行場所を明確にします。生成されたファイルの役割を理解し、不要な設定をコピーして放置せず、構成をバージョン管理と依存関係ファイルで再現できるようにします。

プロジェクトとアプリを分ける

Djangoのプロジェクトは設定やURLルートなどサイト全体の構成を管理し、アプリは特定の機能領域をまとめます。例えば測定記録、利用者管理、レポート表示を別のアプリへ分けると、責任とテスト対象を整理しやすくなります。ただし、小さな機能を過度に細分化すると依存関係が追いにくくなるため、変更理由や再利用性を基準に設計します。アプリを作成した後はINSTALLED_APPSへ登録し、登録忘れや名前の誤りを確認してください。アプリごとのモデル、ビュー、テストをどこへ置くかをチーム内でそろえ、プロジェクトを再作成しても同じ構造を得られることを確かめます。

URLからビューへ処理をつなぐ

URLconfはリクエストのパスをビューへ対応付けます。URLの文字列とビュー関数の責務を分けると、画面構成の変更や機能追加を局所化できます。パス変数を受け取る場合は型や範囲を確認し、利用者が指定した識別子に対してアクセス権を検査します。URL名を付けてreverseや名前付きリンクを使うと、テンプレートに同じパスを複数埋め込まずに済みます。未知のURLには適切な404を返し、内部エラーの詳細を公開しないようにします。URLの末尾スラッシュや大文字小文字の扱いも含めて、期待するルートと誤ったルートをテストしてください。

ビューでリクエストと応答を扱う

ビューはHttpRequestを受け取り、通常はHttpResponseを返します。GETは情報取得、POSTは状態変更など、HTTPメソッドの意味に合う処理を選びましょう。ビューへ業務処理を詰め込みすぎると試験が難しくなるため、計算や検証は別の関数やサービスへ分ける方法を検討します。リクエストの入力をそのまま信頼せず、形式、必須項目、範囲を検証してください。例外を空の応答や成功画面へ変換して隠さず、想定外の失敗をログに記録して適切なエラー応答を返します。ビュー単体の責務と呼び出し先の責務を明確にし、境界条件を含めてテストします。

テンプレートと出力のエスケープ

DjangoテンプレートはデータとHTML表示を分け、共通レイアウトや繰り返し部分を再利用できます。利用者が入力した文字列をHTMLへ表示するときは、自動エスケープを無効化しないでください。安全なHTMLとしてマークする操作は、信頼できる固定内容に限定し、利用者入力や外部データへ適用するとクロスサイトスクリプティングの原因になります。テンプレートに複雑な業務ロジックを置かず、表示に必要なデータをビューから明示的に渡します。存在しない値や空の一覧を自然に表示できるか確認し、日本語の文字コード、日時、数値単位を正しく示してください。画面を見てエスケープとアクセシビリティも検証します。

モデルとデータベースの変更

モデルは保存するデータとその関係を定義します。フィールド型、NULLの扱い、最大長、一意制約、索引を要件に沿って決め、アプリケーション側だけでなくデータベースにも守らせる制約を検討してください。モデルを変更したときはmakemigrationsで変更案を作り、migrationファイルをレビューしてからmigrateを適用します。生成されたマイグレーションがデータを失わないか、既存行への新しい必須列の追加が適切か確認してください。本番データベースへ直接編集を加える運用を避け、バックアップやロールバック手順を用意します。データ量が増えた場合の移行時間やロックも考慮し、変更を段階的に適用します。

ORMによる検索と更新

Django ORMはQuerySetを通してデータベースの検索や更新を表現します。必要な列だけ取得する、関連モデルを適切に読み込む、件数を制限するなどで応答時間とメモリーを管理してください。テンプレート内で関連データを一件ずつ取得するとN+1クエリーが起きることがあるため、実際のクエリー数を計測します。利用者の入力を検索条件として使う場合は許可する項目と値を検証し、任意のフィールド名や生SQLを直接結合しないでください。更新・削除の条件は対象件数を確認し、トランザクションが必要な複数操作をまとめます。開発時にはSQLログやデバッグツールで期待したクエリーになっているか調べます。

フォームと入力検証

Django FormsやModelFormsは入力の変換、必須チェック、エラー表示をまとめる仕組みです。フォームが有効になった後のcleaned_dataを使い、生のPOST値を直接保存しないでください。ブラウザー側の検証は利用者の操作を助けますが、リクエストは改変できるためサーバー側検証が必須です。単位や範囲、相互に関連するフィールドの条件を検証し、エラー理由を必要以上の内部情報なしに説明します。POST後にリダイレクトする設計は再読み込みによる二重送信を防ぎやすくなります。空値、境界値、不正な形式、予想外の選択肢をテストし、誤った入力でデータが変更されないことを確認してください。

CSRF、認証、権限の基本

状態を変更するフォームにはCSRF対策を適用し、テンプレートでDjangoが提供するトークンを使用します。認証済みであることと、対象データを変更する権限があることは別々に検査してください。ログイン済み利用者が別の利用者のレコードをURLのID変更だけで読めないよう、検索対象を利用者や組織の範囲で限定します。SECRET_KEY、データベースパスワード、外部APIキーをソースコードや公開リポジトリに含めないでください。DEBUGを本番で有効にすると詳細な設定やトレースが漏れることがあるため、環境変数や安全な設定管理を用います。公式のデプロイチェックリストでHTTPS、Cookie、許可ホスト、静的ファイルも確認します。

テストクライアントで動作を確かめる

Djangoのテスト機能では、テスト用データベースとクライアントを使ってURL、ビュー、フォーム、権限を検証できます。正常なリクエストだけでなく、未認証、権限不足、存在しないID、不正入力、CSRF条件を含めます。データベースを使うテストは必要なものだけにし、テストが共有の開発データを消さないよう実行環境を確認してください。ステータスコードだけでなく、表示される内容、保存された値、外部処理が呼ばれたかも検査します。テストを独立して何度実行しても同じ結果になること、順番に依存しないことを確かめます。失敗したテストは例外を隠さず、原因を特定できる情報を残します。

本番設定とデプロイを分ける

開発用runserverは本番運用向けではありません。本番では対応するWSGIまたはASGIサーバー、HTTPS終端、許可ホスト、静的ファイル配信、ログ、監視を含む構成を選びます。DEBUGを無効にし、秘密情報を環境変数や秘密管理サービスから読み込み、設定値が欠落した場合は起動時に明示的なエラーを出します。デプロイ前にcheck --deployなどのチェックを実行し、マイグレーション、バックアップ、ロールバック、ヘルスチェックの順序を決めてください。ファイルアップロードを受ける場合はサイズ、拡張子、保存場所、公開権限を制限します。運用後はエラー率や遅延を監視し、ログへ秘密情報を出さないよう定期的に見直します。

練習課題:読み取り専用の状態画面

小さなDjangoアプリで測定記録の一覧ページを作り、URL、ビュー、テンプレート、モデルを通る流れを実装してください。まず読み取りだけの画面にし、登録済みの記録を日時順に表示して、単位と空データの表示を整えます。続けて検索フォームを追加し、入力値をサーバー側で検証してから絞り込みます。テストには正常な一覧、空の結果、不正な検索値、未認証状態を含め、SQLの件数とアクセス範囲も確認してください。最後に開発設定と本番設定の差、秘密値の保管方法、DEBUGを無効にする手順を文書化します。アプリを公開する前に公式デプロイ資料と最新のセキュリティ情報を確認してください。

コード例

手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。

from django.http import HttpResponse


def health(request):
    return HttpResponse("サービス稼働中", content_type="text/plain; charset=utf-8")

手を動かす課題

小さなDjangoプロジェクトでURLからビューを呼び出し、開発サーバーと本番サーバーの役割の違いを説明してください。

参考資料

「DjangoでWebアプリを作る」の章一覧へ