# Django

This section describes integration with Django web framework. The integration supports Django from version 3.0 and above.

## Middleware

Django can be integrated by middleware to apply OpenAPI validation to your entire application.

Add `DjangoOpenAPIMiddleware` to your `MIDDLEWARE` list and define `OPENAPI`.

      # settings.py
      from openapi_core import OpenAPI

      MIDDLEWARE = [
         # ...
         'openapi_core.contrib.django.middlewares.DjangoOpenAPIMiddleware',
      ]

      OPENAPI = OpenAPI.from_dict(spec_dict)

After that all your requests and responses will be validated.

Also you have access to unmarshal result object with all unmarshalled request data through `openapi` attribute of request object.

    from django.views import View

    class MyView(View):
       def get(self, request):
           # get parameters object with path, query, cookies and headers parameters
           unmarshalled_params = request.openapi.parameters
           # or specific location parameters
           unmarshalled_path_params = request.openapi.parameters.path

           # get body
           unmarshalled_body = request.openapi.body

           # get security data
           unmarshalled_security = request.openapi.security

### Response validation

You can skip response validation process: by setting `OPENAPI_RESPONSE_CLS` to `None`

      # settings.py
      from openapi_core import OpenAPI

      MIDDLEWARE = [
         # ...
         'openapi_core.contrib.django.middlewares.DjangoOpenAPIMiddleware',
      ]

      OPENAPI = OpenAPI.from_dict(spec_dict)
      OPENAPI_RESPONSE_CLS = None

## Low level

The integration defines classes useful for low level integration.

### Request

Use `DjangoOpenAPIRequest` to create OpenAPI request from Django request:

    from openapi_core.contrib.django import DjangoOpenAPIRequest

    class MyView(View):
       def get(self, request):
           openapi_request = DjangoOpenAPIRequest(request)
           openapi.validate_request(openapi_request)

### Response

Use `DjangoOpenAPIResponse` to create OpenAPI response from Django response:

    from openapi_core.contrib.django import DjangoOpenAPIResponse

    class MyView(View):
       def get(self, request):
           response = JsonResponse({'hello': 'world'})
           openapi_request = DjangoOpenAPIRequest(request)
           openapi_response = DjangoOpenAPIResponse(response)
           openapi.validate_response(openapi_request, openapi_response)
           return response