Django REST Framework / djangorestframework / views.py

markotibold d89d187 






Tom Christie b78e13c 
Tom Christie 8a14e2b 
Tom Christie b78e13c 
tom ...@tomchris… fb97e18 
Tom Christie 8a14e2b 
Tom Christie b78e13c 

Tom Christie 2f4e949 
tom ...@tomchris… fb97e18 

Tom Christie bc25485 
Tom Christie 8a14e2b 
Tom Christie bc25485 

markotibold 5d775ca 
Tom Christie bc25485 

tom ...@tomchris… fb97e18 


Tom Christie 8a14e2b 
Tom Christie e1e7f94 



tom ...@tomchris… fb97e18 
Tom Christie 741230f 




tom ...@tomchris… fb97e18 
Tom Christie 741230f 


Fernando Zunino 15177b1 
Tom Christie 741230f 


Jens Alm 28fb439 
tom ...@tomchris… fb97e18 
Tom Christie 741230f 


Tom Christie 4455280 

Tom Christie b78e13c 
Tom Christie 741230f 


Tom Christie b78e13c 
markotibold d89d187 
markotibold fd49561 
Tom Christie 3541617 






Tom Christie 8a14e2b 
Tom Christie 3541617 



Tom Christie b78e13c 

Tom Christie 2f4e949 


Tom Christie b78e13c 
tom ...@tomchris… fb97e18 
Tom Christie 0f0a16e 
Tom Christie b78e13c 
Tom Christie 44824e5 
Tom Christie 0f0a16e 
Tom Christie 44824e5 
Tom Christie b78e13c 
Tom Christie 2f4e949 
Tom Christie b78e13c 

Tom Christie 8a14e2b 







Tom Christie d1120ed 
markotibold fd49561 




Tom Christie d1120ed 

Tom Christie b78e13c 



Tom Christie 08f661e 


Tom Christie d1120ed 
Tom Christie 08f661e 




Tom Christie e1e7f94 
Tom Christie 08f661e 
























Tom Christie 9b1c468 
Tom Christie 08f661e 

Tom Christie 9cdf703 
Tom Christie 08f661e 





markotibold fd49561 
Tom Christie d1120ed 

markotibold fd49561 
Tom Christie 08f661e 
Tom Christie b78e13c 

Tom Christie 8a14e2b 
Tom Christie b78e13c 
Tom Christie 2f4e949 
Tom Christie b78e13c 
Tom Christie e1e7f94 
Tom Christie b78e13c 
Tom Christie 3541617 
Tom Christie b78e13c 
Tom Christie 9b1c468 
Tom Christie 3541617 

Tom Christie b78e13c 
Tom Christie 9b1c468 
Tom Christie 3541617 
"""
The :mod:`views` module provides the Views you will most probably
be subclassing in your implementation.

By setting or modifying class attributes on your view, you change it's predefined behaviour.
"""

from django.core.urlresolvers import set_script_prefix
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

from djangorestframework.compat import View as DjangoView
from djangorestframework.response import Response, ErrorResponse
from djangorestframework.mixins import *
from djangorestframework import resources, renderers, parsers, authentication, permissions, status


__all__ = (
    'View',
    'ModelView',
    'InstanceModelView',
    'ListModelView',
    'ListOrCreateModelView'
)



class View(ResourceMixin, RequestMixin, ResponseMixin, AuthMixin, DjangoView):
    """
    Handles incoming requests and maps them to REST operations.
    Performs request deserialization, response serialization, authentication and input validation.
    """

    """
    The resource to use when validating requests and filtering responses,
    or `None` to use default behaviour.
    """
    resource = None

    """
    List of renderers the resource can serialize the response with, ordered by preference.
    """
    renderers = renderers.DEFAULT_RENDERERS    
    """
    List of parsers the resource can parse the request with.
    """
    parsers = parsers.DEFAULT_PARSERS

    """
    List of all authenticating methods to attempt.
    """
    authentication = ( authentication.UserLoggedInAuthentication,
                       authentication.BasicAuthentication )
    
    """
    List of all permissions that must be checked.
    """
    permissions = ( permissions.FullAnonAccess, )
    
    
    @classmethod
    def as_view(cls, **initkwargs):
        """
        Override the default :meth:`as_view` to store an instance of the view
        as an attribute on the callable function.  This allows us to discover
        information about the view when we do URL reverse lookups. 
        """
        view = super(View, cls).as_view(**initkwargs)
        view.cls_instance = cls(**initkwargs)
        return view


    @property
    def allowed_methods(self):
        """
        Return the list of allowed HTTP methods, uppercased.
        """
        return [method.upper() for method in self.http_method_names if hasattr(self, method)]


    def http_method_not_allowed(self, request, *args, **kwargs):
        """
        Return an HTTP 405 error if an operation is called which does not have a handler method.        
        """
        raise ErrorResponse(status.HTTP_405_METHOD_NOT_ALLOWED,
                            {'detail': 'Method \'%s\' not allowed on this resource.' % self.method})


    def initial(self, request, *args, **kargs):
        """
        Hook for any code that needs to run prior to anything else.
        Required if you want to do things like set `request.upload_handlers` before
        the authentication and dispatch handling is run.
        """
        pass


    def add_header(self, field, value):
        """
        Add *field* and *value* to the :attr:`headers` attribute of the :class:`View` class. 
        """
        self.headers[field] = value


    # Note: session based authentication is explicitly CSRF validated,
    # all other authentication is CSRF exempt.
    @csrf_exempt
    def dispatch(self, request, *args, **kwargs):
        self.request = request
        self.args = args
        self.kwargs = kwargs
        self.headers = {}

        # Calls to 'reverse' will not be fully qualified unless we set the scheme/host/port here.
        prefix = '%s://%s' % (request.is_secure() and 'https' or 'http', request.get_host())
        set_script_prefix(prefix)

        try:
            self.initial(request, *args, **kwargs)
        
            # Authenticate and check request has the relevant permissions
            self._check_permissions()

            # Get the appropriate handler method
            if self.method.lower() in self.http_method_names:
                handler = getattr(self, self.method.lower(), self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            response_obj = handler(request, *args, **kwargs)

            # Allow return value to be either HttpResponse, Response, or an object, or None
            if isinstance(response_obj, HttpResponse):
                return response_obj
            elif isinstance(response_obj, Response):
                response = response_obj
            elif response_obj is not None:
                response = Response(status.HTTP_200_OK, response_obj)
            else:
                response = Response(status.HTTP_204_NO_CONTENT)

            # Pre-serialize filtering (eg filter complex objects into natively serializable types)
            response.cleaned_content = self.filter_response(response.raw_content)
    
        except ErrorResponse, exc:
            response = exc.response
        
        # Always add these headers.
        #
        # TODO - this isn't actually the correct way to set the vary header,
        # also it's currently sub-obtimal for HTTP caching - need to sort that out. 
        response.headers['Allow'] = ', '.join(self.allowed_methods)
        response.headers['Vary'] = 'Authenticate, Accept'
        
        # merge with headers possibly set at some point in the view
        response.headers.update(self.headers)
        
        return self.render(response)    


class ModelView(View):
    """A RESTful view that maps to a model in the database."""
    resource = resources.ModelResource

class InstanceModelView(InstanceMixin, ReadModelMixin, UpdateModelMixin, DeleteModelMixin, ModelView):
    """A view which provides default operations for read/update/delete against a model instance."""
    _suffix = 'Instance'

class ListModelView(ListModelMixin, ModelView):
    """A view which provides default operations for list, against a model in the database."""   
    _suffix = 'List'

class ListOrCreateModelView(ListModelMixin, CreateModelMixin, ModelView):
    """A view which provides default operations for list and create, against a model in the database."""   
    _suffix = 'List'
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.