# Django 6.0.7 ドキュメント

# 組み込みのビュー

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`) にアクセスできます。

- もし `DEBUG` が `True` に設定されている場合(設定モジュール内)、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` でレンダリングされ、追加エラーの可能性を減らします。

もし `DEBUG` が `True` に設定されている場合 (設定モジュールで)、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_denied` は `PermissionDenied` 例外がトリガーとなります。ビューでアクセスを拒否するには、次のようなコードを使用します:

    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')

Similarly, Django has a view to handle 400 Bad Request errors.

This view either produces a "Bad Request" message or loads and renders the template `400.html` if you created it in your root template directory. It returns with status code 400 indicating that the error condition was the result of a client operation. By default, nothing related to the exception that triggered the view is passed to the template context, as the exception message might contain sensitive information like filesystem paths.

`django.views.defaults.bad_request` is triggered by a `BadRequest` exception. Also, when a `SuspiciousOperation` is raised in Django, it may be handled by a component of Django (for example resetting the session data). If not specifically handled, Django will consider the current request a 'bad request' instead of a server error, and handle it with `bad_request`.

また、`bad_request` ビューは `DEBUG` が `False` のときだけ使用されます。