## ======= file: ws.py ========
from django.http import HttpResponse
from django.conf.urls.defaults import patterns
from django.core import serializers
class JsonResponse(HttpResponse):
def __init__(self, content, *args, **kwargs):
data = serializers.serialize("json", content)
super(JsonResponse, self).__init__(data, mimetype="text/json", *args, **kwargs)
class JsonWebService(object):
'''
Base class for json-based web services
'''
@staticmethod
def jsonresponse():
def decorator(func):
def wrap_json(*args):
ret = func(*args)
return JsonResponse(ret)
wrap_json._is_json_ws = True
return wrap_json
return decorator
@classmethod
def getActions(cls):
'''
returns the methods decorated with jsonresponse
@param cls:
'''
return filter(lambda k: getattr(getattr(cls, k), '_is_json_ws', False), dir(cls))
@property
def urls(self):
urls = []
for action in self.getActions():
urls.append((r'^json/' + action, getattr(self, action)))
urlpatterns = patterns('', *urls)
return urlpatterns
## example use of JsonWebService
from django.contrib.comments.models import Comment
class SMCommandWS(JsonWebService):
@JsonWebService.jsonresponse()
def getComments(self, request):
'the url will be /ws/json/getComments'
return Comment.objects.all()
ws = MySiteWS()
## ======== file: urls.py ======
from App.ws import ws
...
urlpatterns += patterns('',
(r'^ws/', include(ws.urls)),
)
Comments