Dalam projek baru-baru ini, data json yang dikembalikan dengan memuat naik fail akan digesa untuk memuat turun Masalah ini hanya berlaku dalam IE10. Bahagian hadapan menggunakan ajaxForm pemalam jQuery untuk menyerahkan borang, dan format data yang dikembalikan oleh latar belakang ialah json. Kodnya adalah seperti berikut:
Ular Sawa Bahagian Belakang:
def jsonp(func):
"""Membungkus output JSONified untuk permintaan JSONP."""
@wraps(func)
def decorated_function(*args, **kwargs):
panggil balik = request.args.get('callback', False)
Temp_content = func(*args, **kwargs)
jika isinstance(temp_content, dict):
temp_content.setdefault('berjaya', Benar)
temp_content.setdefault('code', 200)
cuba:
temp_content = json.dumps(temp_content, indent=4)
kecuali UnicodeDecodeError:
cuba:
temp_content = ujson.dumps(temp_content)
kecuali StandardError sebagai e:
Logger.exception(e)
temp_content = json.dumps({'success': False, 'code': 500, 'info': 'INVALID_CONTENT'})
temp_content = cgi.escape(temp_content)
jika panggil balik:
# Berdasarkan
http://evilcos.me/?p=425, jsonp menambah /**/Kepala akan lebih selamat
kandungan = '/**/' str(panggilan balik) '(' temp_content ')'
mimetype = 'application/javascript'
pengepala = {'charset':'utf-8'}
kembalikan current_app.response_class(content, mimetype=mimetype, headers=headers)
lain:
mimetype = 'application/json'
pengepala = {'charset':'utf-8'}
kandungan = temp_content
kembalikan current_app.response_class(content, mimetype=mimetype, headers=headers)
elif isinstance(temp_content, basestring):
temp_content = cgi.escape(temp_content)
kembalikan temp_content
lain:
kembalikan temp_content
Kembalikan fungsi_hiasan
@mod.route('/patch/install.json', method=['POST'])
@jsonp
def patch_install():
Kembalikan {'data': 'data'}
Kod js bahagian hadapan:
$('#form').ajaxSubmit({
URL : '/patch/install.json',
Taip : 'post',
Jenis Data: 'json',
iframe : benar,
Kejayaan: function(res) {
// kod
}
});
Penyelesaian:
Adalah perlu untuk menukar format data yang dikembalikan oleh bahagian belakang kepada format teks/html, seperti berikut:
def plain(func):
"""balut teks/ respons html"""
@wraps(func)
def _inner(*args, **kwargs):
resp = func(*args, **kwargs)
jika isinstance(resp, dict):
resp.setdefault('berjaya', Benar)
resp.setdefault('kod', 200)
resp = json.dumps(resp)
resp = cgi.escape(resp)
return current_app.response_class(resp, mimetype='text/html', headers={'charset': 'utf-8'})
elif isinstance(resp, basestring):
resp = cgi.escape(resp)
return current_app.response_class(resp, mimetype='text/html', headers={'charset': 'utf-8'})
lain:
balas respons
Kembali _dalam
@mod.route('/patch/install.json', method=['POST'])
@biasa
def patch_install():
Kembalikan {'data': 'data'}
Nota: Bahagian belakang contoh ini menggunakan Python Jika anda menghadapi masalah yang sama dalam projek, tukarkannya kepada bahasa yang sepadan
Untuk meringkaskan, sebenarnya, untuk menyelesaikan masalah ini, cukup letakkan dalam satu ayat: "Tukar format data yang dikembalikan oleh bahagian belakang kepada format teks/html"