Skip to content

Instantly share code, notes, and snippets.

@lancelotj
Created March 23, 2012 23:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lancelotj/2176360 to your computer and use it in GitHub Desktop.
Save lancelotj/2176360 to your computer and use it in GitHub Desktop.
Simple REST Framework for Django
# -*- 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