組み込みのビュー

Django の組み込みビューのいくつかは、 ビューを記述する や他のドキュメントで説明されています。

開発中のファイルの配信

static.serve(request, path, document_root, show_indexes=False)

プロジェクトの静的アセット以外にも、利便性のために、ローカル開発で Django に配信させたいファイルがあるかもしれません。 serve() ビューを使えば、任意のディレクトリに配信できます。(このビューは本番環境では 使えない ので、開発の補助としてだけ使ってください。本番環境では実際のフロントエンド Web サーバを使ってこれらのファイルを配信してください)。

最もありそうな例は、 MEDIA_ROOT にあるユーザがアップロードしたコンテンツです。 django.contrib.staticfiles は静的アセット用で、ユーザがアップロードしたファイルに対する組み込みの処理はありませんが、 URLconf に次のような記述を追加することで、 Django に MEDIA_ROOT を配信させることができます:

from django.conf import settings
from django.urls import re_path
from django.views.static import serve

# ... the rest of your URLconf goes here ...

if settings.DEBUG:
    urlpatterns += [
        re_path(
            r"^media/(?P<path>.*)$",
            serve,
            {
                "document_root": settings.MEDIA_ROOT,
            },
        ),
    ]

このコードは MEDIA_URL の値が 'media/' であると仮定しています。これは serve() ビューを呼び出して、 URLconf からのパス (必須) と document_root パラメータを渡します。

この URL パターンを定義するのは少し面倒なので、 Django には小さな URL ヘルパー関数 static() が同梱されています。この関数は MEDIA_URL のようなプレフィックスと、 'django.views.static.serve' のようなビューへのドットパスをパラメータとして受け取ります。その他の関数のパラメータは透過的にビューに渡されます。

エラー・ビュー

Django には HTTP エラーを処理するためのビューがデフォルトでいくつか付属して います。これらを独自のカスタムビューで上書きするには、 エラービューをカスタマイズする を参照してください。

404 (page not found) ビュー

defaults.page_not_found(request, exception, template_name='404.html')

ビュー内で Http404 を発生させると、 Django は 404 エラーの処理に特化した特別なビューを読み込みます。デフォルトでは django.views.defaults.page_not_found() というビューで、"Not Found" メッセージを表示するか、ルートテンプレートディレクトリにテンプレート 404.html を作成した場合、それを読み込んでレンダリングします。

デフォルトの404ビューはテンプレートに2つの変数を渡します。request_path はエラーの原因となった URL で、exception はビューのトリガーとなった例外の有用な表現です (たとえば、特定の Http404 インスタンスに渡されたメッセージなど)。

404ビューには以下の3つの注意点があります:

  • 404 ビューは、 Django が URLconf 内の正規表現を全てチェックしてもマッチしない場合にも呼び出されます。

  • 404 ビューには RequestContext が渡され、テンプレートコンテキストプロセッサが提供する変数 (たとえば MEDIA_URL) にアクセスできます。

  • もし DEBUGTrue に設定されている場合(設定モジュール内)、404ビューは使用されず、代わりに URLconf がデバッグ情報と共に表示されます。

500(サーバーエラー)ビュー

defaults.server_error(request, template_name='500.html')

同様に、Django はビューコードで実行時エラーが発生した場合、特別なケースの動作を実行します。ビューで例外が発生した場合、 Django はデフォルトで django.views.defaults.server_error というビューを呼び出します。このビューは "Server Error" というメッセージを表示するか、ルートテンプレートディレクトリにテンプレート 500.html を作成した場合、それを読み込んでレンダリングします。

デフォルトの500ビューは 500.html テンプレートに変数を渡さず、空の Context でレンダリングされ、追加エラーの可能性を減らします。

もし DEBUGTrue に設定されている場合 (設定モジュールで)、500 ビューは使用されず、代わりにトレースバックがデバッグ情報と共に表示されます。

403 (HTTP Forbidden) ビュー

defaults.permission_denied(request, exception, template_name='403.html')

404 や 500 のビューと同じように、 Django には 403 Forbidden エラーを扱うビューがあります。ビューで 403 例外が発生した場合、 Django はデフォルトで django.views.defaults.permission_denied というビューを呼び出します。

このビューはルートテンプレートディレクトリにあるテンプレート 403.html を読み込んでレンダリングします。このファイルが存在しない場合は、代わりに RFC 9110#section-15.5.4 (HTTP 1.1 仕様) に従って "403 Forbidden" というテキストを配信します。テンプレートコンテキストは exception を含んでおり、これはビューのトリガーとなった例外の文字列表現です。

django.views.defaults.permission_deniedPermissionDenied 例外がトリガーとなります。ビューでアクセスを拒否するには、次のようなコードを使用します:

from django.core.exceptions import PermissionDenied


def edit(request, pk):
    if not request.user.is_staff:
        raise PermissionDenied
    # ...

400(bad request)ビュー

defaults.bad_request(request, exception, template_name='400.html')

Django で SuspiciousOperation が発生すると、 Django のコンポーネントで処理されるかもしれません (たとえばセッションデータのリセットなど)。特に処理されない場合、 Django は現在のリクエストをサーバエラーではなく「不正なリクエスト」と見なします。

django.views.defaults.bad_requestserver_error ビューとよく似ていますが、エラー状態がクライアント操作の結果であることを示すステータスコード 400 を返します。デフォルトでは、例外メッセージにファイルシステムのパスのような機密情報が含まれている可能性があるため、ビューのトリガーとなった例外に関係するものはテンプレートコンテキストに渡されません。

また、bad_request ビューは DEBUGFalse のときだけ使用されます。

Back to Top