aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework/methods.py
blob: 06a9664342dbddd547902f3421b082e03af8fc44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
"""Mixin classes that provide a determine_method(request) function to determine the HTTP
method that a given request should be treated as.  We use this more generic behaviour to
allow for overloaded methods in POST forms.

See Richardson & Ruby's RESTful Web Services for justification.
"""

class MethodMixin(object):
    """Base class for all MethodMixin classes, which simply defines the interface they provide."""
    def determine_method(self, request):
        """Simply return GET, POST etc... as appropriate."""
        raise NotImplementedError()

   
class StandardMethodMixin(MethodMixin):
    """Provide for standard HTTP behaviour, with no overloaded POST."""

    def determine_method(self, request):
        """Simply return GET, POST etc... as appropriate."""
        return request.method.upper()


class OverloadedPOSTMethodMixin(MethodMixin):
    """Provide for overloaded POST behaviour."""

    """The name to use for the method override field in the POST form."""
    FORM_PARAM_METHOD = '_method'

    def determine_method(self, request):
        """Simply return GET, POST etc... as appropriate, allowing for POST overloading
        by setting a form field with the requested method name."""
        method = request.method.upper()
        if method == 'POST' and self.FORM_PARAM_METHOD and request.POST.has_key(self.FORM_PARAM_METHOD):
            method = request.POST[self.FORM_PARAM_METHOD].upper()
        return method