Skip to content

Commit 40623e1

Browse files
committed
add json_request decorator with test-cases
1 parent 98b1dcd commit 40623e1

File tree

2 files changed

+128
-1
lines changed

2 files changed

+128
-1
lines changed

jsonview/decorators.py

+28
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,31 @@ def _wrapped(request, *a, **kw):
159159
return decorator(args[0])
160160
else:
161161
return decorator
162+
163+
164+
def json_request(*args, **kwargs):
165+
assume_json = bool(kwargs.get('assume_json', True))
166+
167+
def decorator(f):
168+
@wraps(f)
169+
def _wrapped(request, *a, **kw):
170+
request.data = {}
171+
if assume_json or request.META.get('CONTENT_TYPE') == JSON:
172+
try:
173+
if isinstance(request.body, bytes):
174+
request.data = json.loads(request.body.decode('ascii'))
175+
else:
176+
request.data = json.loads(request.body)
177+
except:
178+
pass
179+
elif request.method == 'GET':
180+
request.data = request.GET.dict()
181+
elif request.method == 'POST':
182+
request.data = request.POST.dict()
183+
return f(request, *a, **kw)
184+
return _wrapped
185+
186+
if len(args) == 1 and callable(args[0]):
187+
return decorator(args[0])
188+
else:
189+
return decorator

jsonview/tests.py

+100-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import mock
1919

20-
from .decorators import json_view
20+
from .decorators import json_view, json_request
2121
from .exceptions import BadRequest
2222

2323

@@ -29,6 +29,7 @@ def eq_(a, b, msg=None):
2929
"""From nose.tools.eq_."""
3030
assert a == b, msg or '%r != %r' % (a, b)
3131

32+
3233
if sys.version < '3':
3334
def b(x):
3435
return x
@@ -326,3 +327,101 @@ def get(self, request):
326327
eq_(JSON, res['content-type'])
327328
data = json.loads(res.content.decode('utf-8'))
328329
eq_('bar', data['foo'])
330+
331+
332+
class JsonRequestTests(TestCase):
333+
def test_application_json(self):
334+
data = {
335+
'foo': 'bar',
336+
'baz': 'qux',
337+
'quz': [{'foo': 'bar'}],
338+
}
339+
340+
@json_request
341+
def temp(req):
342+
return req.data
343+
344+
res = temp(rf.post(
345+
'/',
346+
data=json.dumps(data),
347+
content_type='application/json'
348+
))
349+
eq_(res, data)
350+
351+
def test_get_requests(self):
352+
data = {
353+
'foo': 'bar',
354+
'baz': '0'
355+
}
356+
357+
@json_request(assume_json=False)
358+
def temp(req):
359+
return req.data
360+
361+
res = temp(rf.get('/?foo=bar&baz=0'))
362+
eq_(res, data)
363+
364+
def test_post_requests(self):
365+
data = {
366+
'foo': 'bar',
367+
'baz': '0'
368+
}
369+
370+
@json_request(assume_json=False)
371+
def temp(req):
372+
return req.data
373+
374+
# test application/x-www-form-urlencoded
375+
res = temp(rf.post(
376+
'/',
377+
data='foo=bar&baz=0',
378+
content_type='application/x-www-form-urlencoded'
379+
))
380+
eq_(res, data)
381+
382+
# test multipart/form-data
383+
res = temp(rf.post('/', data=data, files=None))
384+
eq_(res, data)
385+
386+
def test_assume_json(self):
387+
data = {
388+
'foo': 'bar',
389+
'baz': '0'
390+
}
391+
392+
@json_request(assume_json=True)
393+
def temp(req):
394+
return req.data
395+
396+
@json_request(assume_json=False)
397+
def temp_2(req):
398+
return req.data
399+
400+
# test get request
401+
res = temp(rf.get('/?foo=bar&baz=0'))
402+
eq_(res, {})
403+
404+
res = temp_2(rf.get('/?foo=bar&baz=0'))
405+
eq_(res, data)
406+
407+
# test application/x-www-form-urlencoded
408+
res = temp(rf.post(
409+
'/',
410+
data='foo=bar&baz=0',
411+
content_type='application/x-www-form-urlencoded'
412+
))
413+
eq_(res, {})
414+
415+
res = temp_2(rf.post(
416+
'/',
417+
data='foo=bar&baz=0',
418+
content_type='application/x-www-form-urlencoded'
419+
))
420+
eq_(res, data)
421+
422+
# test multipart/form-data
423+
res = temp(rf.post('/', data=data, files=None))
424+
eq_(res, {})
425+
426+
res = temp_2(rf.post('/', data=data, files=None))
427+
eq_(res, data)

0 commit comments

Comments
 (0)