Browse Source

Add jsonp support inside of jsonify

pull/437/head
Christoph Heer 13 years ago committed by Ned Jackson Lovely
parent
commit
cb24646948
  1. 21
      flask/helpers.py
  2. 14
      flask/testsuite/helpers.py

21
flask/helpers.py

@ -117,9 +117,30 @@ def jsonify(*args, **kwargs):
information about this, have a look at :ref:`json-security`. information about this, have a look at :ref:`json-security`.
.. versionadded:: 0.2 .. versionadded:: 0.2
.. versionadded:: 0.9
If the argument ``padded`` true than the json object will pad for
JSONP calls like from jquery. The response mimetype will also change
to ``text/javascript``.
The json object will pad as javascript function with the function name
from the request argument ``callback`` or ``jsonp``. If the argument
``padded`` a string jsonify will look for the function name in the
request argument with the name which is equal to ``padded``. Is there
no function name it will fallback and use ``jsonp`` as function name.
""" """
if __debug__: if __debug__:
_assert_have_json() _assert_have_json()
if 'padded' in kwargs:
if isinstance(kwargs['padded'], str):
callback = request.args.get(kwargs['padded']) or 'jsonp'
else:
callback = request.args.get('callback') or \
request.args.get('jsonp') or 'jsonp'
del kwargs['padded']
json_str = json.dumps(dict(*args, **kwargs), indent=None)
content = str(callback) + "(" + json_str + ")"
return current_app.response_class(content, mimetype='text/javascript')
return current_app.response_class(json.dumps(dict(*args, **kwargs), return current_app.response_class(json.dumps(dict(*args, **kwargs),
indent=None if request.is_xhr else 2), mimetype='application/json') indent=None if request.is_xhr else 2), mimetype='application/json')

14
flask/testsuite/helpers.py

@ -61,11 +61,25 @@ class JSONTestCase(FlaskTestCase):
@app.route('/dict') @app.route('/dict')
def return_dict(): def return_dict():
return flask.jsonify(d) return flask.jsonify(d)
@app.route("/padded")
def return_padded_json():
return flask.jsonify(d, padded=True)
@app.route("/padded_custom")
def return_padded_json_custom_callback():
return flask.jsonify(d, padded='my_func_name')
c = app.test_client() c = app.test_client()
for url in '/kw', '/dict': for url in '/kw', '/dict':
rv = c.get(url) rv = c.get(url)
self.assert_equal(rv.mimetype, 'application/json') self.assert_equal(rv.mimetype, 'application/json')
self.assert_equal(flask.json.loads(rv.data), d) self.assert_equal(flask.json.loads(rv.data), d)
for get_arg in 'callback=funcName', 'jsonp=funcName':
rv = c.get('/padded?' + get_arg)
self.assert_( rv.data.startswith("funcName(") )
self.assert_( rv.data.endswith(")") )
rv_json = rv.data.split('(')[1].split(')')[0]
self.assert_equal(flask.json.loads(rv_json), d)
rv = c.get('/padded_custom?my_func_name=funcName')
self.assert_( rv.data.startswith("funcName(") )
def test_json_attr(self): def test_json_attr(self):
app = flask.Flask(__name__) app = flask.Flask(__name__)

Loading…
Cancel
Save