Source code for restless.http
from django import http
from django.core.serializers.json import DjangoJSONEncoder
try:
# json module from python > 2.6
import json
except ImportError:
# use packaged django version of simplejson
from django.utils import simplejson as json
__all__ = ['JSONResponse', 'JSONErrorResponse', 'HttpError',
'Http200', 'Http201', 'Http400', 'Http401', 'Http403']
[docs]class JSONResponse(http.HttpResponse):
"""HTTP response with JSON body ("application/json" content type)"""
def __init__(self, data, **kwargs):
"""
Create a new JSONResponse with the provided data (will be serialized
to JSON using django.core.serializers.json.DjangoJSONEncoder).
"""
kwargs['content_type'] = 'application/json; charset=utf-8'
super(JSONResponse, self).__init__(json.dumps(data,
cls=DjangoJSONEncoder), **kwargs)
[docs]class JSONErrorResponse(JSONResponse):
"""HTTP Error response with JSON body ("application/json" content type)"""
def __init__(self, reason, **additional_data):
"""
Create a new JSONErrorResponse with the provided error reason (string)
and the optional additional data (will be added to the resulting
JSON object).
"""
resp = {'error': reason}
resp.update(additional_data)
super(JSONErrorResponse, self).__init__(resp)
[docs]class Http200(JSONResponse):
"""HTTP 200 OK"""
pass
[docs]class Http201(JSONResponse):
"""HTTP 201 CREATED"""
status_code = 201
[docs]class Http400(JSONErrorResponse, http.HttpResponseBadRequest):
"""HTTP 400 Bad Request"""
pass
[docs]class Http401(http.HttpResponse):
"""HTTP 401 UNAUTHENTICATED"""
status_code = 401
def __init__(self, typ='basic', realm="api"):
super(Http401, self).__init__()
if typ == 'basic':
self['WWW-Authenticate'] = 'Basic realm="%s"' % realm
else:
assert False, 'Invalid type ' + str(typ)
self.status_code = 403
[docs]class Http403(JSONErrorResponse, http.HttpResponseForbidden):
"""HTTP 403 FORBIDDEN"""
pass
class Http404(JSONErrorResponse):
"""HTTP 404 Not Found"""
status_code = 404
class Http409(JSONErrorResponse):
"""HTTP 409 Conflict"""
status_code = 409
class Http500(JSONErrorResponse):
"""HTTP 500 Internal Server Error"""
status_code = 500
[docs]class HttpError(Exception):
"""Exception that results in returning a JSONErrorResponse to the user."""
def __init__(self, code, reason, **additional_data):
super(HttpError, self).__init__(self, reason)
self.response = JSONErrorResponse(reason, **additional_data)
self.response.status_code = code