class ReadOnlyModelViewSet
from rest_framework.viewsets import ReadOnlyModelViewSet
    A viewset that provides default `list()` and `retrieve()` actions.
    
    
            Ancestors (MRO)
- ReadOnlyModelViewSet
- RetrieveModelMixin
- ListModelMixin
- GenericViewSet
- ViewSetMixin
- GenericAPIView
- APIView
- View
Attributes
| Defined in | |
|---|---|
| 
                                        allowed_methods = <property object at 0x7fc91c508770>
                                     | APIView | 
| 
                                        authentication_classes = [<class 'rest_framework.authentication.SessionAuthentication'>, <class 'rest_framework.authentication.BasicAuthentication'>]
                                     | APIView | 
| 
                                        content_negotiation_class = <class 'rest_framework.negotiation.DefaultContentNegotiation'>
                                     | APIView | 
| 
                                        default_response_headers = <property object at 0x7fc91c5092b0>
                                     | APIView | 
| 
                                        filter_backends = []
                                     | GenericAPIView | 
| 
                                        http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
                                     | View | 
| 
                                        lookup_field = 'pk'
                                     | GenericAPIView | 
| 
                                        lookup_url_kwarg = None
                                     | GenericAPIView | 
| 
                                        metadata_class = <class 'rest_framework.metadata.SimpleMetadata'>
                                     | APIView | 
| 
                                        pagination_class = None
                                     | GenericAPIView | 
| 
                                        paginator = <property object at 0x7fc91c87fbf0>
                                     | GenericAPIView | 
| 
                                        parser_classes = [<class 'rest_framework.parsers.JSONParser'>, <class 'rest_framework.parsers.FormParser'>, <class 'rest_framework.parsers.MultiPartParser'>]
                                     | APIView | 
| 
                                        permission_classes = [<class 'rest_framework.permissions.AllowAny'>]
                                     | APIView | 
| 
                                        queryset = None
                                     | GenericAPIView | 
| 
                                        renderer_classes = [<class 'rest_framework.renderers.JSONRenderer'>, <class 'rest_framework.renderers.BrowsableAPIRenderer'>]
                                     | APIView | 
| 
                                        schema = <rest_framework.schemas.openapi.AutoSchema object at 0x7fc91c33be50>
                                     | APIView | 
| 
                                        serializer_class = None
                                     | GenericAPIView | 
| 
                                        settings = <rest_framework.settings.APISettings object at 0x7fc91c7a8dc0>
                                     | APIView | 
| 
                                        throttle_classes = []
                                     | APIView | 
| 
                                        versioning_class = None
                                     | APIView | 
Methods
                                
                                    def
                                    _allowed_methods(self):
                                
                                 ¶
                                
                                    View
                                
                            
                            def _allowed_methods(self):
        return [m.upper() for m in self.http_method_names if hasattr(self, m)]
                                
                                    def
                                    as_view(cls, actions=None, **initkwargs):
                                
                                 ¶
                                
                            
                        ViewSetMixin
        Because of the way class based views create a closure around the
        instantiated view, we need to totally reimplement `.as_view`,
        and slightly modify the view function that is created and returned.
        
                                                    @classonlymethod
    def as_view(cls, actions=None, **initkwargs):
        """
        Because of the way class based views create a closure around the
        instantiated view, we need to totally reimplement `.as_view`,
        and slightly modify the view function that is created and returned.
        """
        # The name and description initkwargs may be explicitly overridden for
        # certain route configurations. eg, names of extra actions.
        cls.name = None
        cls.description = None
        # The suffix initkwarg is reserved for displaying the viewset type.
        # This initkwarg should have no effect if the name is provided.
        # eg. 'List' or 'Instance'.
        cls.suffix = None
        # The detail initkwarg is reserved for introspecting the viewset type.
        cls.detail = None
        # Setting a basename allows a view to reverse its action urls. This
        # value is provided by the router through the initkwargs.
        cls.basename = None
        # actions must not be empty
        if not actions:
            raise TypeError("The `actions` argument must be provided when "
                            "calling `.as_view()` on a ViewSet. For example "
                            "`.as_view({'get': 'list'})`")
        # sanitize keyword arguments
        for key in initkwargs:
            if key in cls.http_method_names:
                raise TypeError("You tried to pass in the %s method name as a "
                                "keyword argument to %s(). Don't do that."
                                % (key, cls.__name__))
            if not hasattr(cls, key):
                raise TypeError("%s() received an invalid keyword %r" % (
                    cls.__name__, key))
        # name and suffix are mutually exclusive
        if 'name' in initkwargs and 'suffix' in initkwargs:
            raise TypeError("%s() received both `name` and `suffix`, which are "
                            "mutually exclusive arguments." % (cls.__name__))
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            # We also store the mapping of request methods to actions,
            # so that we can later set the action attribute.
            # eg. `self.action = 'list'` on an incoming GET request.
            self.action_map = actions
            # Bind methods to actions
            # This is the bit that's different to a standard view
            for method, action in actions.items():
                handler = getattr(self, action)
                setattr(self, method, handler)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.request = request
            self.args = args
            self.kwargs = kwargs
            # And continue as usual
            return self.dispatch(request, *args, **kwargs)
        # take name and docstring from class
        update_wrapper(view, cls, updated=())
        # and possible attributes set by decorators
        # like csrf_exempt from dispatch
        update_wrapper(view, cls.dispatch, assigned=())
        # We need to set these on the view function, so that breadcrumb
        # generation can pick out these bits of information from a
        # resolved URL.
        view.cls = cls
        view.initkwargs = initkwargs
        view.actions = actions
        return csrf_exempt(view)
APIView
        Store the original class on the view function.
        This allows us to discover information about the view when we do URL
        reverse lookups.  Used for breadcrumb generation.
        
                                                    @classmethod
    def as_view(cls, **initkwargs):
        """
        Store the original class on the view function.
        This allows us to discover information about the view when we do URL
        reverse lookups.  Used for breadcrumb generation.
        """
        if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
            def force_evaluation():
                raise RuntimeError(
                    'Do not evaluate the `.queryset` attribute directly, '
                    'as the result will be cached and reused between requests. '
                    'Use `.all()` or call `.get_queryset()` instead.'
                )
            cls.queryset._fetch_all = force_evaluation
        view = super().as_view(**initkwargs)
        view.cls = cls
        view.initkwargs = initkwargs
        # Note: session based authentication is explicitly CSRF validated,
        # all other authentication is CSRF exempt.
        return csrf_exempt(view)
View
Main entry point for a request-response process.
    @classonlymethod
    def as_view(cls, **initkwargs):
        """Main entry point for a request-response process."""
        for key in initkwargs:
            if key in cls.http_method_names:
                raise TypeError(
                    'The method name %s is not accepted as a keyword argument '
                    'to %s().' % (key, cls.__name__)
                )
            if not hasattr(cls, key):
                raise TypeError("%s() received an invalid keyword %r. as_view "
                                "only accepts arguments that are already "
                                "attributes of the class." % (cls.__name__, key))
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            self.setup(request, *args, **kwargs)
            if not hasattr(self, 'request'):
                raise AttributeError(
                    "%s instance has no 'request' attribute. Did you override "
                    "setup() and forget to call super()?" % cls.__name__
                )
            return self.dispatch(request, *args, **kwargs)
        view.view_class = cls
        view.view_initkwargs = initkwargs
        # take name and docstring from class
        update_wrapper(view, cls, updated=())
        # and possible attributes set by decorators
        # like csrf_exempt from dispatch
        update_wrapper(view, cls.dispatch, assigned=())
        return view
                                
                                    def
                                    check_object_permissions(self, request, obj):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Check if the request should be permitted for a given object.
        Raises an appropriate exception if the request is not permitted.
        
                                                    def check_object_permissions(self, request, obj):
        """
        Check if the request should be permitted for a given object.
        Raises an appropriate exception if the request is not permitted.
        """
        for permission in self.get_permissions():
            if not permission.has_object_permission(request, self, obj):
                self.permission_denied(
                    request, message=getattr(permission, 'message', None)
                )
                                
                                    def
                                    check_permissions(self, request):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Check if the request should be permitted.
        Raises an appropriate exception if the request is not permitted.
        
                                                    def check_permissions(self, request):
        """
        Check if the request should be permitted.
        Raises an appropriate exception if the request is not permitted.
        """
        for permission in self.get_permissions():
            if not permission.has_permission(request, self):
                self.permission_denied(
                    request, message=getattr(permission, 'message', None)
                )
                                
                                    def
                                    check_throttles(self, request):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Check if request should be throttled.
        Raises an appropriate exception if the request is throttled.
        
                                                    def check_throttles(self, request):
        """
        Check if request should be throttled.
        Raises an appropriate exception if the request is throttled.
        """
        throttle_durations = []
        for throttle in self.get_throttles():
            if not throttle.allow_request(request, self):
                throttle_durations.append(throttle.wait())
        if throttle_durations:
            # Filter out `None` values which may happen in case of config / rate
            # changes, see #1438
            durations = [
                duration for duration in throttle_durations
                if duration is not None
            ]
            duration = max(durations, default=None)
            self.throttled(request, duration)
                                
                                    def
                                    determine_version(self, request, *args, **kwargs):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        If versioning is being used, then determine any API version for the
        incoming request. Returns a two-tuple of (version, versioning_scheme)
        
                                                    def determine_version(self, request, *args, **kwargs):
        """
        If versioning is being used, then determine any API version for the
        incoming request. Returns a two-tuple of (version, versioning_scheme)
        """
        if self.versioning_class is None:
            return (None, None)
        scheme = self.versioning_class()
        return (scheme.determine_version(request, *args, **kwargs), scheme)
                                
                                    def
                                    dispatch(self, request, *args, **kwargs):
                                
                                 ¶
                                
                            
                        APIView
        `.dispatch()` is pretty much the same as Django's regular dispatch,
        but with extra hooks for startup, finalize, and exception handling.
        
                                                    def dispatch(self, request, *args, **kwargs):
        """
        `.dispatch()` is pretty much the same as Django's regular dispatch,
        but with extra hooks for startup, finalize, and exception handling.
        """
        self.args = args
        self.kwargs = kwargs
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request
        self.headers = self.default_response_headers  # deprecate?
        try:
            self.initial(request, *args, **kwargs)
            # Get the appropriate handler method
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed
            response = handler(request, *args, **kwargs)
        except Exception as exc:
            response = self.handle_exception(exc)
        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response
View
    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
                                
                                    def
                                    filter_queryset(self, queryset):
                                
                                 ¶
                                
                                    GenericAPIView
                                
                            
                        
        Given a queryset, filter it with whichever filter backend is in use.
        You are unlikely to want to override this method, although you may need
        to call it either from a list view, or from a custom `get_object`
        method if you want to apply the configured filtering backend to the
        default queryset.
        
                                                    def filter_queryset(self, queryset):
        """
        Given a queryset, filter it with whichever filter backend is in use.
        You are unlikely to want to override this method, although you may need
        to call it either from a list view, or from a custom `get_object`
        method if you want to apply the configured filtering backend to the
        default queryset.
        """
        for backend in list(self.filter_backends):
            queryset = backend().filter_queryset(self.request, queryset, self)
        return queryset
                                
                                    def
                                    finalize_response(self, request, response, *args, **kwargs):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Returns the final response object.
        
                                                    def finalize_response(self, request, response, *args, **kwargs):
        """
        Returns the final response object.
        """
        # Make the error obvious if a proper response is not returned
        assert isinstance(response, HttpResponseBase), (
            'Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` '
            'to be returned from the view, but received a `%s`'
            % type(response)
        )
        if isinstance(response, Response):
            if not getattr(request, 'accepted_renderer', None):
                neg = self.perform_content_negotiation(request, force=True)
                request.accepted_renderer, request.accepted_media_type = neg
            response.accepted_renderer = request.accepted_renderer
            response.accepted_media_type = request.accepted_media_type
            response.renderer_context = self.get_renderer_context()
        # Add new vary headers to the response instead of overwriting.
        vary_headers = self.headers.pop('Vary', None)
        if vary_headers is not None:
            patch_vary_headers(response, cc_delim_re.split(vary_headers))
        for key, value in self.headers.items():
            response[key] = value
        return response
                                
                                    def
                                    get_authenticate_header(self, request):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        If a request is unauthenticated, determine the WWW-Authenticate
        header to use for 401 responses, if any.
        
                                                    def get_authenticate_header(self, request):
        """
        If a request is unauthenticated, determine the WWW-Authenticate
        header to use for 401 responses, if any.
        """
        authenticators = self.get_authenticators()
        if authenticators:
            return authenticators[0].authenticate_header(request)
                                
                                    def
                                    get_authenticators(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Instantiates and returns the list of authenticators that this view can use.
        
                                                    def get_authenticators(self):
        """
        Instantiates and returns the list of authenticators that this view can use.
        """
        return [auth() for auth in self.authentication_classes]
                                
                                    def
                                    get_content_negotiator(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Instantiate and return the content negotiation class to use.
        
                                                    def get_content_negotiator(self):
        """
        Instantiate and return the content negotiation class to use.
        """
        if not getattr(self, '_negotiator', None):
            self._negotiator = self.content_negotiation_class()
        return self._negotiator
                                
                                    def
                                    get_exception_handler(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Returns the exception handler that this view uses.
        
                                                    def get_exception_handler(self):
        """
        Returns the exception handler that this view uses.
        """
        return self.settings.EXCEPTION_HANDLER
                                
                                    def
                                    get_exception_handler_context(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Returns a dict that is passed through to EXCEPTION_HANDLER,
        as the `context` argument.
        
                                                    def get_exception_handler_context(self):
        """
        Returns a dict that is passed through to EXCEPTION_HANDLER,
        as the `context` argument.
        """
        return {
            'view': self,
            'args': getattr(self, 'args', ()),
            'kwargs': getattr(self, 'kwargs', {}),
            'request': getattr(self, 'request', None)
        }
                                
                                    def
                                    get_extra_action_url_map(self):
                                
                                 ¶
                                
                                    ViewSetMixin
                                
                            
                        
        Build a map of {names: urls} for the extra actions.
        This method will noop if `detail` was not provided as a view initkwarg.
        
                                                    def get_extra_action_url_map(self):
        """
        Build a map of {names: urls} for the extra actions.
        This method will noop if `detail` was not provided as a view initkwarg.
        """
        action_urls = OrderedDict()
        # exit early if `detail` has not been provided
        if self.detail is None:
            return action_urls
        # filter for the relevant extra actions
        actions = [
            action for action in self.get_extra_actions()
            if action.detail == self.detail
        ]
        for action in actions:
            try:
                url_name = '%s-%s' % (self.basename, action.url_name)
                url = reverse(url_name, self.args, self.kwargs, request=self.request)
                view = self.__class__(**action.kwargs)
                action_urls[view.get_view_name()] = url
            except NoReverseMatch:
                pass  # URL requires additional arguments, ignore
        return action_urls
                                
                                    def
                                    get_extra_actions(cls):
                                
                                 ¶
                                
                                    ViewSetMixin
                                
                            
                        
        Get the methods that are marked as an extra ViewSet `@action`.
        
                                                    @classmethod
    def get_extra_actions(cls):
        """
        Get the methods that are marked as an extra ViewSet `@action`.
        """
        return [method for _, method in getmembers(cls, _is_extra_action)]
                                
                                    def
                                    get_format_suffix(self, **kwargs):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Determine if the request includes a '.json' style format suffix
        
                                                    def get_format_suffix(self, **kwargs):
        """
        Determine if the request includes a '.json' style format suffix
        """
        if self.settings.FORMAT_SUFFIX_KWARG:
            return kwargs.get(self.settings.FORMAT_SUFFIX_KWARG)
                                
                                    def
                                    get_object(self):
                                
                                 ¶
                                
                                    GenericAPIView
                                
                            
                        
        Returns the object the view is displaying.
        You may want to override this if you need to provide non-standard
        queryset lookups.  Eg if objects are referenced using multiple
        keyword arguments in the url conf.
        
                                                    def get_object(self):
        """
        Returns the object the view is displaying.
        You may want to override this if you need to provide non-standard
        queryset lookups.  Eg if objects are referenced using multiple
        keyword arguments in the url conf.
        """
        queryset = self.filter_queryset(self.get_queryset())
        # Perform the lookup filtering.
        lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
        assert lookup_url_kwarg in self.kwargs, (
            'Expected view %s to be called with a URL keyword argument '
            'named "%s". Fix your URL conf, or set the `.lookup_field` '
            'attribute on the view correctly.' %
            (self.__class__.__name__, lookup_url_kwarg)
        )
        filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
        obj = get_object_or_404(queryset, **filter_kwargs)
        # May raise a permission denied
        self.check_object_permissions(self.request, obj)
        return obj
                                
                                    def
                                    get_paginated_response(self, data):
                                
                                 ¶
                                
                                    GenericAPIView
                                
                            
                        
        Return a paginated style `Response` object for the given output data.
        
                                                    def get_paginated_response(self, data):
        """
        Return a paginated style `Response` object for the given output data.
        """
        assert self.paginator is not None
        return self.paginator.get_paginated_response(data)
                                
                                    def
                                    get_parser_context(self, http_request):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Returns a dict that is passed through to Parser.parse(),
        as the `parser_context` keyword argument.
        
                                                    def get_parser_context(self, http_request):
        """
        Returns a dict that is passed through to Parser.parse(),
        as the `parser_context` keyword argument.
        """
        # Note: Additionally `request` and `encoding` will also be added
        #       to the context by the Request object.
        return {
            'view': self,
            'args': getattr(self, 'args', ()),
            'kwargs': getattr(self, 'kwargs', {})
        }
                                
                                    def
                                    get_parsers(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Instantiates and returns the list of parsers that this view can use.
        
                                                    def get_parsers(self):
        """
        Instantiates and returns the list of parsers that this view can use.
        """
        return [parser() for parser in self.parser_classes]
                                
                                    def
                                    get_permissions(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Instantiates and returns the list of permissions that this view requires.
        
                                                    def get_permissions(self):
        """
        Instantiates and returns the list of permissions that this view requires.
        """
        return [permission() for permission in self.permission_classes]
                                
                                    def
                                    get_queryset(self):
                                
                                 ¶
                                
                                    GenericAPIView
                                
                            
                        
        Get the list of items for this view.
        This must be an iterable, and may be a queryset.
        Defaults to using `self.queryset`.
        This method should always be used rather than accessing `self.queryset`
        directly, as `self.queryset` gets evaluated only once, and those results
        are cached for all subsequent requests.
        You may want to override this if you need to provide different
        querysets depending on the incoming request.
        (Eg. return a list of items that is specific to the user)
        
                                                    def get_queryset(self):
        """
        Get the list of items for this view.
        This must be an iterable, and may be a queryset.
        Defaults to using `self.queryset`.
        This method should always be used rather than accessing `self.queryset`
        directly, as `self.queryset` gets evaluated only once, and those results
        are cached for all subsequent requests.
        You may want to override this if you need to provide different
        querysets depending on the incoming request.
        (Eg. return a list of items that is specific to the user)
        """
        assert self.queryset is not None, (
            "'%s' should either include a `queryset` attribute, "
            "or override the `get_queryset()` method."
            % self.__class__.__name__
        )
        queryset = self.queryset
        if isinstance(queryset, QuerySet):
            # Ensure queryset is re-evaluated on each request.
            queryset = queryset.all()
        return queryset
                                
                                    def
                                    get_renderer_context(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Returns a dict that is passed through to Renderer.render(),
        as the `renderer_context` keyword argument.
        
                                                    def get_renderer_context(self):
        """
        Returns a dict that is passed through to Renderer.render(),
        as the `renderer_context` keyword argument.
        """
        # Note: Additionally 'response' will also be added to the context,
        #       by the Response object.
        return {
            'view': self,
            'args': getattr(self, 'args', ()),
            'kwargs': getattr(self, 'kwargs', {}),
            'request': getattr(self, 'request', None)
        }
                                
                                    def
                                    get_renderers(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Instantiates and returns the list of renderers that this view can use.
        
                                                    def get_renderers(self):
        """
        Instantiates and returns the list of renderers that this view can use.
        """
        return [renderer() for renderer in self.renderer_classes]
                                
                                    def
                                    get_serializer(self, *args, **kwargs):
                                
                                 ¶
                                
                                    GenericAPIView
                                
                            
                        
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        
                                                    def get_serializer(self, *args, **kwargs):
        """
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        """
        serializer_class = self.get_serializer_class()
        kwargs['context'] = self.get_serializer_context()
        return serializer_class(*args, **kwargs)
                                
                                    def
                                    get_serializer_class(self):
                                
                                 ¶
                                
                                    GenericAPIView
                                
                            
                        
        Return the class to use for the serializer.
        Defaults to using `self.serializer_class`.
        You may want to override this if you need to provide different
        serializations depending on the incoming request.
        (Eg. admins get full serialization, others get basic serialization)
        
                                                    def get_serializer_class(self):
        """
        Return the class to use for the serializer.
        Defaults to using `self.serializer_class`.
        You may want to override this if you need to provide different
        serializations depending on the incoming request.
        (Eg. admins get full serialization, others get basic serialization)
        """
        assert self.serializer_class is not None, (
            "'%s' should either include a `serializer_class` attribute, "
            "or override the `get_serializer_class()` method."
            % self.__class__.__name__
        )
        return self.serializer_class
                                
                                    def
                                    get_serializer_context(self):
                                
                                 ¶
                                
                                    GenericAPIView
                                
                            
                        
        Extra context provided to the serializer class.
        
                                                    def get_serializer_context(self):
        """
        Extra context provided to the serializer class.
        """
        return {
            'request': self.request,
            'format': self.format_kwarg,
            'view': self
        }
                                
                                    def
                                    get_throttles(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Instantiates and returns the list of throttles that this view uses.
        
                                                    def get_throttles(self):
        """
        Instantiates and returns the list of throttles that this view uses.
        """
        return [throttle() for throttle in self.throttle_classes]
                                
                                    def
                                    get_view_description(self, html=False):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Return some descriptive text for the view, as used in OPTIONS responses
        and in the browsable API.
        
                                                    def get_view_description(self, html=False):
        """
        Return some descriptive text for the view, as used in OPTIONS responses
        and in the browsable API.
        """
        func = self.settings.VIEW_DESCRIPTION_FUNCTION
        return func(self, html)
                                
                                    def
                                    get_view_name(self):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Return the view name, as used in OPTIONS responses and in the
        browsable API.
        
                                                    def get_view_name(self):
        """
        Return the view name, as used in OPTIONS responses and in the
        browsable API.
        """
        func = self.settings.VIEW_NAME_FUNCTION
        return func(self)
                                
                                    def
                                    handle_exception(self, exc):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Handle any exception that occurs, by returning an appropriate response,
        or re-raising the error.
        
                                                    def handle_exception(self, exc):
        """
        Handle any exception that occurs, by returning an appropriate response,
        or re-raising the error.
        """
        if isinstance(exc, (exceptions.NotAuthenticated,
                            exceptions.AuthenticationFailed)):
            # WWW-Authenticate header for 401 responses, else coerce to 403
            auth_header = self.get_authenticate_header(self.request)
            if auth_header:
                exc.auth_header = auth_header
            else:
                exc.status_code = status.HTTP_403_FORBIDDEN
        exception_handler = self.get_exception_handler()
        context = self.get_exception_handler_context()
        response = exception_handler(exc, context)
        if response is None:
            self.raise_uncaught_exception(exc)
        response.exception = True
        return response
                                
                                    def
                                    http_method_not_allowed(self, request, *args, **kwargs):
                                
                                 ¶
                                
                            
                        APIView
        If `request.method` does not correspond to a handler method,
        determine what kind of exception to raise.
        
                                                    def http_method_not_allowed(self, request, *args, **kwargs):
        """
        If `request.method` does not correspond to a handler method,
        determine what kind of exception to raise.
        """
        raise exceptions.MethodNotAllowed(request.method)
View
    def http_method_not_allowed(self, request, *args, **kwargs):
        logger.warning(
            'Method Not Allowed (%s): %s', request.method, request.path,
            extra={'status_code': 405, 'request': request}
        )
        return HttpResponseNotAllowed(self._allowed_methods())
                                
                                    def
                                    initial(self, request, *args, **kwargs):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Runs anything that needs to occur prior to calling the method handler.
        
                                                    def initial(self, request, *args, **kwargs):
        """
        Runs anything that needs to occur prior to calling the method handler.
        """
        self.format_kwarg = self.get_format_suffix(**kwargs)
        # Perform content negotiation and store the accepted info on the request
        neg = self.perform_content_negotiation(request)
        request.accepted_renderer, request.accepted_media_type = neg
        # Determine the API version, if versioning is in use.
        version, scheme = self.determine_version(request, *args, **kwargs)
        request.version, request.versioning_scheme = version, scheme
        # Ensure that the incoming request is permitted
        self.perform_authentication(request)
        self.check_permissions(request)
        self.check_throttles(request)
                                
                                    def
                                    initialize_request(self, request, *args, **kwargs):
                                
                                 ¶
                                
                            
                        ViewSetMixin
        Set the `.action` attribute on the view, depending on the request method.
        
                                                    def initialize_request(self, request, *args, **kwargs):
        """
        Set the `.action` attribute on the view, depending on the request method.
        """
        request = super().initialize_request(request, *args, **kwargs)
        method = request.method.lower()
        if method == 'options':
            # This is a special case as we always provide handling for the
            # options method in the base `View` class.
            # Unlike the other explicitly defined actions, 'metadata' is implicit.
            self.action = 'metadata'
        else:
            self.action = self.action_map.get(method)
        return request
APIView
        Returns the initial request object.
        
                                                    def initialize_request(self, request, *args, **kwargs):
        """
        Returns the initial request object.
        """
        parser_context = self.get_parser_context(request)
        return Request(
            request,
            parsers=self.get_parsers(),
            authenticators=self.get_authenticators(),
            negotiator=self.get_content_negotiator(),
            parser_context=parser_context
        )
                                
                                    def
                                    list(self, request, *args, **kwargs):
                                
                                 ¶
                                
                                    ListModelMixin
                                
                            
                            def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
                                
                                    def
                                    options(self, request, *args, **kwargs):
                                
                                 ¶
                                
                            
                        APIView
        Handler method for HTTP 'OPTIONS' request.
        
                                                    def options(self, request, *args, **kwargs):
        """
        Handler method for HTTP 'OPTIONS' request.
        """
        if self.metadata_class is None:
            return self.http_method_not_allowed(request, *args, **kwargs)
        data = self.metadata_class().determine_metadata(request, self)
        return Response(data, status=status.HTTP_200_OK)
View
Handle responding to requests for the OPTIONS HTTP verb.
    def options(self, request, *args, **kwargs):
        """Handle responding to requests for the OPTIONS HTTP verb."""
        response = HttpResponse()
        response.headers['Allow'] = ', '.join(self._allowed_methods())
        response.headers['Content-Length'] = '0'
        return response
                                
                                    def
                                    paginate_queryset(self, queryset):
                                
                                 ¶
                                
                                    GenericAPIView
                                
                            
                        
        Return a single page of results, or `None` if pagination is disabled.
        
                                                    def paginate_queryset(self, queryset):
        """
        Return a single page of results, or `None` if pagination is disabled.
        """
        if self.paginator is None:
            return None
        return self.paginator.paginate_queryset(queryset, self.request, view=self)
                                
                                    def
                                    perform_authentication(self, request):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Perform authentication on the incoming request.
        Note that if you override this and simply 'pass', then authentication
        will instead be performed lazily, the first time either
        `request.user` or `request.auth` is accessed.
        
                                                    def perform_authentication(self, request):
        """
        Perform authentication on the incoming request.
        Note that if you override this and simply 'pass', then authentication
        will instead be performed lazily, the first time either
        `request.user` or `request.auth` is accessed.
        """
        request.user
                                
                                    def
                                    perform_content_negotiation(self, request, force=False):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        Determine which renderer and media type to use render the response.
        
                                                    def perform_content_negotiation(self, request, force=False):
        """
        Determine which renderer and media type to use render the response.
        """
        renderers = self.get_renderers()
        conneg = self.get_content_negotiator()
        try:
            return conneg.select_renderer(request, renderers, self.format_kwarg)
        except Exception:
            if force:
                return (renderers[0], renderers[0].media_type)
            raise
                                
                                    def
                                    permission_denied(self, request, message=None):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        If request is not permitted, determine what kind of exception to raise.
        
                                                    def permission_denied(self, request, message=None):
        """
        If request is not permitted, determine what kind of exception to raise.
        """
        if request.authenticators and not request.successful_authenticator:
            raise exceptions.NotAuthenticated()
        raise exceptions.PermissionDenied(detail=message)
                                
                                    def
                                    raise_uncaught_exception(self, exc):
                                
                                 ¶
                                
                                    APIView
                                
                            
                            def raise_uncaught_exception(self, exc):
        if settings.DEBUG:
            request = self.request
            renderer_format = getattr(request.accepted_renderer, 'format')
            use_plaintext_traceback = renderer_format not in ('html', 'api', 'admin')
            request.force_plaintext_errors(use_plaintext_traceback)
        raise exc
                                
                                    def
                                    retrieve(self, request, *args, **kwargs):
                                
                                 ¶
                                
                                    RetrieveModelMixin
                                
                            
                            def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)
                                
                                    def
                                    reverse_action(self, url_name, *args, **kwargs):
                                
                                 ¶
                                
                                    ViewSetMixin
                                
                            
                        
        Reverse the action for the given `url_name`.
        
                                                    def reverse_action(self, url_name, *args, **kwargs):
        """
        Reverse the action for the given `url_name`.
        """
        url_name = '%s-%s' % (self.basename, url_name)
        kwargs.setdefault('request', self.request)
        return reverse(url_name, *args, **kwargs)
                                
                                    def
                                    setup(self, request, *args, **kwargs):
                                
                                 ¶
                                
                                    View
                                
                            
                        Initialize attributes shared by all view methods.
    def setup(self, request, *args, **kwargs):
        """Initialize attributes shared by all view methods."""
        if hasattr(self, 'get') and not hasattr(self, 'head'):
            self.head = self.get
        self.request = request
        self.args = args
        self.kwargs = kwargs
                                
                                    def
                                    throttled(self, request, wait):
                                
                                 ¶
                                
                                    APIView
                                
                            
                        
        If request is throttled, determine what kind of exception to raise.
        
                                                    def throttled(self, request, wait):
        """
        If request is throttled, determine what kind of exception to raise.
        """
        raise exceptions.Throttled(wait)