this is my first post on python programming for this blog..i will share with you how to implement REST
using only django..ok, let say i have this structure of django project
myproject/ __init__.py hello.py lib/
__init__.py rest.py shortcuts.py manage.py settings.py urls.py
take note that hello.py and lib package(folder) is my code,not came with django-admin.py startproject myproject
ok,let me explain how we implement REST in this django project..
in the lib package,rest.py have some classes that will handle REST method and in shortcuts.py there is some functions that will handle json request and response
file : myproject/lib/rest.py
# myproject/lib/rest.py
from django.http import HttpResponseNotAllowed
class RESTmethod(object):
methods = ['GET','POST','PUT','DELETE']
def __call__(self, request, *args, **kwargs):
callback = getattr(self, request.method.lower(), None)
if callback:
return callback(request, *args, **kwargs)
else:
return HttpResponseNotAllowed(self.get_allowed_methods())
def get_allowed_methods(self):
return [method for method in self.methods if hasattr(self, method.lower())]
class StatusCode(object):
OK = 200
NOT_FOUND = 404
# add more status code according to your need
file : myproject/lib/shortcuts.py
# myproject/lib/shortcuts.py
from myproject.lib.rest import StatusCode
from django.utils import simplejson as json
from django.http import HttpResponse
def JSONResponse(data = None, status = StatusCode.OK):
if data is None:
return HttpResponse(status)
if data and type(data) is dict:
return HttpResponse(json.dumps(data, indent = 4, encoding = 'utf-8', sort_keys = True), \
mimetype = 'application/json', status = status)
else:
return HttpResponse(status = StatusCode.NOT_FOUND)
def getJSONObject(request):
data = None
if request.raw_post_data:
try:
data = json.loads(request.raw_post_data.replace("'","\""), encoding = 'utf-8')
except:
data = data
if data and type(data) is dict:
return data
then in hello.py
file : hello.py
# myproject/hello.py
from myproject.lib.rest import RESTmethod, StatusCode
from myproject.lib.shortcuts import getJSONObject, JSONResponse
class Hello(RESTmethod):
def get(self, request):
requestdata = getJSONObject(request)
if requestdata:
return JSONResponse(requestdata)
return JSONResponse(status = StatusCode.NOT_FOUND)
def post(self, request):
requestdata = getJSONObject(request)
if requestdata:
return JSONResponse(requestdata)
return JSONResponse(status = StatusCode.NOT_FOUND)
# add put, delete functions yourself..function is according to methods in RESTmehtod class in lowercase name
lastly in urls.py
file : myproject/urls.py
# myproject/urls.py
from django.conf.urls import *
from myproject.hello import Hello
urlpatterns = patterns('',
(r'/hello$', Hello()),
)
that’s all,the project is ready for testing..but dont forget to append your parent folder of myproject in django.wsgi script..see the guide here
you can test it with googlechrome rest client Chrome REST Client or firefox rest client Firefox REST Client
remember to test with json request!
all the best guys!