==============Built-in Views==============.. module:: django.views:synopsis: Django's built-in views.Several of Django's built-in views are documented in:doc:`/topics/http/views` as well as elsewhere in the documentation.Serving files in development============================.. function:: static.serve(request, path, document_root, show_indexes=False)There may be files other than your project's static assets that, forconvenience, you'd like to have Django serve for you in local development.The :func:`~django.views.static.serve` view can be used to serve any directoryyou give it. (This view is **not** hardened for production use and should beused only as a development aid; you should serve these files in productionusing a real front-end web server).The most likely example is user-uploaded content in :setting:`MEDIA_ROOT`.``django.contrib.staticfiles`` is intended for static assets and has nobuilt-in handling for user-uploaded files, but you can have Django serve your:setting:`MEDIA_ROOT` by appending something like this to your URLconf::from django.conf import settingsfrom django.urls import re_pathfrom 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,}),]Note, the snippet assumes your :setting:`MEDIA_URL` has a value of``'media/'``. This will call the :func:`~django.views.static.serve` view,passing in the path from the URLconf and the (required) ``document_root``parameter.Since it can become a bit cumbersome to define this URL pattern, Djangoships with a small URL helper function :func:`~django.conf.urls.static.static`that takes as parameters the prefix such as :setting:`MEDIA_URL` and a dottedpath to a view, such as ``'django.views.static.serve'``. Any other functionparameter will be transparently passed to the view... _error-views:Error views===========Django comes with a few views by default for handling HTTP errors. To overridethese with your own custom views, see :ref:`customizing-error-views`... _http_not_found_view:The 404 (page not found) view-----------------------------.. function:: defaults.page_not_found(request, exception, template_name='404.html')When you raise :exc:`~django.http.Http404` from within a view, Django loads aspecial view devoted to handling 404 errors. By default, it's the view:func:`django.views.defaults.page_not_found`, which either produces a "NotFound" message or loads and renders the template ``404.html`` if you created itin your root template directory.The default 404 view will pass two variables to the template: ``request_path``,which is the URL that resulted in the error, and ``exception``, which is auseful representation of the exception that triggered the view (e.g. containingany message passed to a specific ``Http404`` instance).Three things to note about 404 views:* The 404 view is also called if Django doesn't find a match afterchecking every regular expression in the URLconf.* The 404 view is passed a :class:`~django.template.RequestContext` andwill have access to variables supplied by your template contextprocessors (e.g. ``MEDIA_URL``).* If :setting:`DEBUG` is set to ``True`` (in your settings module), thenyour 404 view will never be used, and your URLconf will be displayedinstead, with some debug information... _http_internal_server_error_view:The 500 (server error) view---------------------------.. function:: defaults.server_error(request, template_name='500.html')Similarly, Django executes special-case behavior in the case of runtime errorsin view code. If a view results in an exception, Django will, by default, callthe view ``django.views.defaults.server_error``, which either produces a"Server Error" message or loads and renders the template ``500.html`` if youcreated it in your root template directory.The default 500 view passes no variables to the ``500.html`` template and isrendered with an empty ``Context`` to lessen the chance of additional errors.If :setting:`DEBUG` is set to ``True`` (in your settings module), thenyour 500 view will never be used, and the traceback will be displayedinstead, with some debug information... _http_forbidden_view:The 403 (HTTP Forbidden) view-----------------------------.. function:: defaults.permission_denied(request, exception, template_name='403.html')In the same vein as the 404 and 500 views, Django has a view to handle 403Forbidden errors. If a view results in a 403 exception then Django will, bydefault, call the view ``django.views.defaults.permission_denied``.This view loads and renders the template ``403.html`` in your root templatedirectory, or if this file does not exist, instead serves the text"403 Forbidden", as per :rfc:`7231#section-6.5.3` (the HTTP 1.1 Specification).The template context contains ``exception``, which is the stringrepresentation of the exception that triggered the view.``django.views.defaults.permission_denied`` is triggered by a:exc:`~django.core.exceptions.PermissionDenied` exception. To deny access in aview you can use code like this::from django.core.exceptions import PermissionDenieddef edit(request, pk):if not request.user.is_staff:raise PermissionDenied# ..... _http_bad_request_view:The 400 (bad request) view--------------------------.. function:: defaults.bad_request(request, exception, template_name='400.html')When a :exc:`~django.core.exceptions.SuspiciousOperation` is raised in Django,it may be handled by a component of Django (for example resetting the sessiondata). If not specifically handled, Django will consider the current request a'bad request' instead of a server error.``django.views.defaults.bad_request``, is otherwise very similar to the``server_error`` view, but returns with the status code 400 indicating thatthe error condition was the result of a client operation. By default, nothingrelated to the exception that triggered the view is passed to the templatecontext, as the exception message might contain sensitive information likefilesystem paths.``bad_request`` views are also only used when :setting:`DEBUG` is ``False``.