2013-10-17 26 views
5

Ho riscontrato un problema strano relativo all'unicic nelle richieste ajax al server API Flask-Restful. Il problema appare solo su una macchina, ma non su un'altra.Unicode in Flask-Restful API e problema JSON

Ho una classe riposante. Come puoi notare i campi dei caratteri sono impostati su unicode.

class PostListApi(Resource): 
def __init__(self): 
     self.reqparse = reqparse.RequestParser() 
     self.reqparse.add_argument('body', type = unicode, required = True, help = 'No description provided', location = 'json') 
     self.reqparse.add_argument('longitude', type = float, required = False, help = 'Unknown address', location = 'json') 
     self.reqparse.add_argument('latitude', type = float, required = False, help = 'Unknown address', location = 'json') 
     self.reqparse.add_argument('address', type = unicode, required = True, help = 'No address specified', location = 'json') 
     self.reqparse.add_argument('scheduled', type = str, required = True, help = 'Not scheduled correctly', location = 'json') 
     super(PostListApi, self).__init__() 

Il mio problema è che quando invio una richiesta AJAX con caratteri latini nel corpo, il server risponde con l'errore 400.

Request URL: 
Request Method:POST 
Status Code:400 BAD REQUEST 
Request Headersview source 
Accept:undefined 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Content-Length:159 
**Content-Type:application/json; charset=UTF-8** 
Proxy-Authorization:Basic a3lyeWxvLnlhdHNlbmtvOnBhc3N3b3JkMTIzNDU2 
Proxy-Connection:keep-alive 
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 
X-Requested-With:XMLHttpRequest 
Request Payloadview parsed 
{"body":"this is a test","address":"141 Rue Saint-Martin, 75003 Paris, France","longitude":2.351530499999967,"latitude":48.8614575,"scheduled":"20131017 1000"} 

Ma quando i dati sono in alfabeto cirillico, il server gestisce correttamente la richiesta.

Request URL: 
Request Method:POST 
Status Code:500 INTERNAL SERVER ERROR 
Request Headersview source 
Accept:undefined 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Content-Length:208 
**Content-Type:application/json; charset=UTF-8** 
Cookie: 
Proxy-Authorization:Basic a3lyeWxvLnlhdHNlbmtvOnBhc3N3b3JkMTIzNDU2 
Proxy-Connection:keep-alive 
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 
X-Requested-With:XMLHttpRequest 
Request Payloadview source 
{body:Йн незл ножтрюд оффÑндйт вÑш,…} 
address: "Йн незл ножтрюд оффÑндйт вÑш" 
body: "Йн незл ножтрюд оффÑндйт вÑш" 
latitude: 48.8614575 
longitude: 2.351530499999967 
scheduled: "20131017 1000" 
Response Headersview source 
Connection:Keep-Alive 
Content-Length:51 
Content-Type:application/json 
Date:Thu, 17 Oct 2013 08:03:41 GMT 
Proxy-Connection:Keep-Alive 
Server:WSGIServer/0.1 Python/2.7.5 

Richiesta generazione è fatto con il metodo ajax di jQuery

Hai incontrato un problema simile prima d'ora? Come può essere affrontato? Suppongo che i caratteri latini debbano anche essere codificati in unicode prima di inviarli al server. Come potrei forzare jquery a codificare tutto in unicode?

Grazie in anticipo!

+1

'quando i dati sono in alfabeto cyrilic il server gestisce la richiesta correttamente.' A giudicare dal terzo pezzo di codice che hai postato quando invii cose in Cyryllic il server risponde con codice 500 - Errore interno del server, quindi anche questo non va bene. Quella classe PostListApi è tutto ciò che hai sul server? Che ne dici di alcune rotte e funzioni di visualizzazione? –

+0

Non sono sicuro di capire la tua domanda. Il server non risponde con codice 500 se il testo è ** in ** cirillico. L'errore 400 (parametro non trovato) si verifica quando il testo è in latino (primo esempio di richiesta). – ryzhiy

+0

@ryzhiy: la risposta contiene '" Codice di stato: 500 ERRORE INTERNO SERVER "'. Come l'hai preso? Come si genera l'output, potresti invece mostrare 'repr()'? – jfs

risposta

6

utilizzare il codice follow ed io non ho questo problema e problema con uscita

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
from flask import Flask 
from flask.ext.restful import Api 
from flask.ext.restful.representations.json import output_json 
output_json.func_globals['settings'] = {'ensure_ascii': False, 'encoding': 'utf8'} 
app = Flask(__name__) 
api = Api(app) 
... 
+0

L'unica cosa che funziona per me! – Ricardo