Dans les projets récents, les données json renvoyées par le téléchargement de fichiers seront invitées à être téléchargées. Ce problème ne se produit que dans IE10. Le front-end utilise le plug-in jQuery ajaxForm pour soumettre le formulaire, et le format de données renvoyé par l'arrière-plan est json. Le code est le suivant :
Python back-end :
def jsonp(func):
"""Encapsule la sortie JSONifiée pour les requêtes JSONP."""
@wraps(func)
def décoré_function(*args, **kwargs):
callback = request.args.get('callback', False)
temp_content = func(*args, **kwargs)
if isinstance(temp_content, dict):
temp_content.setdefault('success', True)
temp_content.setdefault('code', 200)
essayez :
temp_content = json.dumps(temp_content, indent=4)
sauf UnicodeDecodeError :
essayez :
temp_content = ujson.dumps(temp_content)
sauf StandardError comme e:
Logger.exception(e)
temp_content = json.dumps({'success' : False, 'code' : 500, 'info' : 'INVALID_CONTENT'})
temp_content = cgi.escape(temp_content)
si rappel :
# Basé sur
http://evilcos.me/?p=425, jsonp ajoute /**/La tête sera plus en sécurité
contenu = '/**/' str(callback) '(' temp_content ')'
mimetype = 'application/javascript'
en-têtes = {'charset':'utf-8'}
return current_app.response_class(content, mimetype=mimetype, headers=headers)
autre :
mimetype = 'application/json'
en-têtes = {'charset':'utf-8'}
contenu = temp_content
return current_app.response_class(content, mimetype=mimetype, headers=headers)
elif isinstance(temp_content, basestring):
temp_content = cgi.escape(temp_content)
return temp_content
autre :
return temp_content
Retour décoré_function
@mod.route('/patch/install.json', méthodes=['POST'])
@jsonp
def patch_install() :
Renvoie {'data' : 'data'}
Code js frontal :
$('#form').ajaxSubmit({
URL : '/patch/install.json',
Tapez : 'post',
Type de données : 'json',
iframe : vrai,
Succès : fonction(res) {
// code
>
});
Solution :
Il est nécessaire de changer le format des données renvoyées par le backend au format texte/html, comme suit :
def plain(func):
"""envelopper le texte/réponse HTML"""
@wraps(func)
def _inner(*args, **kwargs):
resp = func(*args, **kwargs)
if isinstance(resp, dict):
resp.setdefault('success', True)
resp.setdefault('code', 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'})
autre :
retour réponse
Retour _inner
@mod.route('/patch/install.json', méthodes=['POST'])
@plaine
def patch_install() :
Renvoie {'data' : 'data'}
Remarque : le backend de cet exemple utilise Python. Si vous rencontrez le même problème dans le projet, remplacez-le par le langage correspondant
Pour résumer, en fait, pour résoudre ce problème, mettez-le simplement en une phrase : "Changez le format des données renvoyées par le backend au format texte/html"