Created
March 23, 2012 23:31
-
-
Save lancelotj/2176360 to your computer and use it in GitHub Desktop.
Simple REST Framework for Django
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from django.core import serializers | |
from django.http import HttpResponse | |
from django.utils import simplejson as json | |
from django.views.generic import View | |
from django.views.generic.edit import ModelFormMixin, BaseUpdateView, FormMixin, TemplateResponseMixin | |
class JsonResponseMixin(object): | |
""" | |
Returns a json response. | |
""" | |
serializer = serializers.get_serializer('json')() | |
content_type = 'application/json' | |
def render_to_response(self, context, **http_response_kwargs): | |
"Returns a JSON response containing 'context' as payload" | |
res = HttpResponse(content_type=self.content_type, | |
**http_response_kwargs) | |
# The following are for IE specifically | |
res['Pragma'] = 'no-cache' | |
res['Cache-Control'] = 'no-cache' | |
res['Expires'] = '-1' | |
self._begin_response(context, res) | |
json.dump(context, res) | |
self._end_response(context, res) | |
return res | |
def _begin_response(self, context, response): | |
pass | |
def _end_response(self, context, response): | |
pass | |
class TextJsonResponseMixin(JsonResponseMixin): | |
""" | |
Returns a <textarea> wrapped json response. Specially used for post | |
data in file upload field. | |
""" | |
content_type = 'text/html' | |
def _begin_response(self, context, response): | |
response.write(u'<textarea>') | |
def _end_response(self, context, response): | |
response.write(u'</textarea>') | |
class FormPutMixin(ModelFormMixin): | |
""" | |
Supports HTTP PUT method for a FormMixin | |
""" | |
def get_form_kwargs(self): | |
""" | |
Returns the keyword arguments for instanciating the form. | |
""" | |
if self.request.method == 'PUT': | |
self.request.method = 'POST' | |
self.request._load_post_and_files() | |
self.request.method = 'PUT' | |
self.request.PUT = self.request.POST | |
return super(FormPutMixin, self).get_form_kwargs() | |
class BaseCollectionView(FormMixin, View): | |
def post(self, request, *args, **kwargs): | |
form = self.get_form(self.form_class) | |
if form.is_valid(): | |
return self.form_valid(form) | |
else: | |
return self.form_invalid(form) | |
def form_invalid(self, form): | |
return self.render_to_response({'success': False, | |
'errors': form.errors}) | |
class BaseSingleView(FormPutMixin, BaseUpdateView): | |
""" | |
Supports HTTP PUT | |
""" | |
def form_invalid(self, form): | |
return self.render_to_response({'success': False, | |
'errors': form.errors}) | |
def delete(self, request, *args, **kwargs): | |
self.get_object().delete() | |
return self.render_to_response({'success': True}) | |
class ApiResponseMixin(JsonResponseMixin, TemplateResponseMixin): | |
def render_to_response(self, context): | |
if self.request.method == 'GET': | |
return TemplateResponseMixin.render_to_response(self, context) | |
else: | |
return JsonResponseMixin.render_to_response(self, context) | |
class ApiCollectionView(ApiResponseMixin, BaseCollectionView): | |
pass | |
class ApiSingleView(JsonResponseMixin, BaseSingleView): | |
pass |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment