Skip to content

Commit 1bc768d

Browse files
nitinbhojwanijsocol
authored andcommitted
Add json_request decorator and test cases
1 parent a5fb700 commit 1bc768d

File tree

2 files changed

+127
-1
lines changed

2 files changed

+127
-1
lines changed

jsonview/decorators.py

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

jsonview/tests.py

+99-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
from .views import JsonView
2323

@@ -396,3 +396,101 @@ def get(self, request):
396396
eq_(JSON, res['content-type'])
397397
data = json.loads(res.content.decode('utf-8'))
398398
eq_('bar', data['foo'])
399+
400+
401+
class JsonRequestTests(TestCase):
402+
def test_application_json(self):
403+
data = {
404+
'foo': 'bar',
405+
'baz': 'qux',
406+
'quz': [{'foo': 'bar'}],
407+
}
408+
409+
@json_request
410+
def temp(req):
411+
return req.data
412+
413+
res = temp(rf.post(
414+
'/',
415+
data=json.dumps(data),
416+
content_type='application/json'
417+
))
418+
eq_(res, data)
419+
420+
def test_get_requests(self):
421+
data = {
422+
'foo': 'bar',
423+
'baz': '0'
424+
}
425+
426+
@json_request(assume_json=False)
427+
def temp(req):
428+
return req.data
429+
430+
res = temp(rf.get('/?foo=bar&baz=0'))
431+
eq_(res, data)
432+
433+
def test_post_requests(self):
434+
data = {
435+
'foo': 'bar',
436+
'baz': '0'
437+
}
438+
439+
@json_request(assume_json=False)
440+
def temp(req):
441+
return req.data
442+
443+
# test application/x-www-form-urlencoded
444+
res = temp(rf.post(
445+
'/',
446+
data='foo=bar&baz=0',
447+
content_type='application/x-www-form-urlencoded'
448+
))
449+
eq_(res, data)
450+
451+
# test multipart/form-data
452+
res = temp(rf.post('/', data=data, files=None))
453+
eq_(res, data)
454+
455+
def test_assume_json(self):
456+
data = {
457+
'foo': 'bar',
458+
'baz': '0'
459+
}
460+
461+
@json_request(assume_json=True)
462+
def temp(req):
463+
return req.data
464+
465+
@json_request(assume_json=False)
466+
def temp_2(req):
467+
return req.data
468+
469+
# test get request
470+
res = temp(rf.get('/?foo=bar&baz=0'))
471+
eq_(res, {})
472+
473+
res = temp_2(rf.get('/?foo=bar&baz=0'))
474+
eq_(res, data)
475+
476+
# test application/x-www-form-urlencoded
477+
res = temp(rf.post(
478+
'/',
479+
data='foo=bar&baz=0',
480+
content_type='application/x-www-form-urlencoded'
481+
))
482+
eq_(res, {})
483+
484+
res = temp_2(rf.post(
485+
'/',
486+
data='foo=bar&baz=0',
487+
content_type='application/x-www-form-urlencoded'
488+
))
489+
eq_(res, data)
490+
491+
# test multipart/form-data
492+
res = temp(rf.post('/', data=data, files=None))
493+
eq_(res, {})
494+
495+
res = temp_2(rf.post('/', data=data, files=None))
496+
eq_(res, data)

0 commit comments

Comments
 (0)