Tastypie con la aplicación / x-www-form-urlencoded

Me cuesta un poco averiguar cuáles deberían ser mis próximos pasos. Estoy usando tastypie para crear una API para mi aplicación web.

Desde otra aplicación, específicamente ifbyphone.com, recibo un POST sin encabezados que se parece a esto:

post data:http://myapp.com/api/ callerid=1&someid=2&number=3&result=Answered&phoneid=4 

Ahora, veo en mis registros del servidor que esto está afectando a mi servidor. Pero tastypie se queja sobre el formato de la POST.

{“error_message”: “El formato indicado ‘application / x-www-form-urlencoded’ no tenía un método de deserialización disponible. Verifique los formats y los content_types en su Serializador.”, “traceback”: “Traceback (última llamada más reciente) : \ n \ n Archivo \ “/ usr / local / lib / python2.7 / dist-packages / tastypie / resources.py \”

También recibo el mismo mensaje cuando trato de POST datos en bruto utilizando curl, lo que “creo” es el mismo proceso básico que utiliza el método POST de ifbyphone:

 curl -X POST --data 'callerid=1&someid=2&number=3&duration=4&phoneid=5' http://myapp.com/api/ 

Entonces, suponiendo que mi problema es en realidad lo que se especifica en el mensaje de error, y no hay un método de deserialización, ¿cómo podría escribir uno?

#### Actualizar ######

Con algo de ayuda de este commit ( https://github.com/toastdriven/django-tastypie/commit/7c5ea699ff6a5e8ba0788f23446fa3ac31f1b8bf ) He estado jugando con mi propio serializador, copiando el marco básico de la documentación ( https: // django -tastypie.readthedocs.org/en/latest/serialization.html#implementing-your-own-serializer )

 import urlparse from tastypie.serializers import Serializer class urlencodeSerializer(Serializer): formats = ['json', 'jsonp', 'xml', 'yaml', 'html', 'plist', 'urlencode'] content_types = { 'json': 'application/json', 'jsonp': 'text/javascript', 'xml': 'application/xml', 'yaml': 'text/yaml', 'html': 'text/html', 'plist': 'application/x-plist', 'urlencode': 'application/x-www-form-urlencoded', } def from_urlencode(self, data,options=None): """ handles basic formencoded url posts """ qs = dict((k, v if len(v)>1 else v[0] ) for k, v in urlparse.parse_qs(data).iteritems()) return qs def to_urlencode(self,content): pass 

Esto funcionó como se esperaba cuando edité mi modelo de recurso para usar realmente la clase de serializador que creé. Esto no estaba claro en la documentación.

 class urlencodeSerializer(Serializer): formats = ['json', 'jsonp', 'xml', 'yaml', 'html', 'plist', 'urlencode'] content_types = { 'json': 'application/json', 'jsonp': 'text/javascript', 'xml': 'application/xml', 'yaml': 'text/yaml', 'html': 'text/html', 'plist': 'application/x-plist', 'urlencode': 'application/x-www-form-urlencoded', } def from_urlencode(self, data,options=None): """ handles basic formencoded url posts """ qs = dict((k, v if len(v)>1 else v[0] ) for k, v in urlparse.parse_qs(data).iteritems()) return qs def to_urlencode(self,content): pass MyModelResource(ModelResoucre): class Meta: ... serializer = urlencodeSerializer() # IMPORTANT 

Me gustaría agregar una modificación al from_urlencode mencionado en el post de Brandon Bertelsen para trabajar mejor con personajes internacionales:

 def from_urlencode(self, data, options=None): """ handles basic formencoded url posts """ qs = {} for k, v in urlparse.parse_qs(data).iteritems(): value = v if len(v)>1 else v[0] value = value.encode("latin-1").decode('utf-8') qs[k] = value return qs 

No estoy seguro de si esto se debe a una razón ambiental de mi parte, pero descubrí que al usar la siguiente cadena “ÁáÄäÅåÉéííÑññóóööÚúÜü” y la función original, tuve algunos problemas.

Cuando esta cadena se codifica en URL, se convierte en: “% C3% 81% C3% A1% C3% 84% C3% A4% C3% 85% C3% A5% C3% 89% C3% A9% C3% 8D% C3 % AD% C3% 91% C3% B1% C3% 93% C3% B3% C3% 96% C3% B6% C3% 9A% C3% BA% C3% 9C% C3% BC ”

Cuando esto se decodifica la URL, tenemos: u ‘\ xc3 \ x81 \ xc3 \ xa1 \ xc3 \ x84 \ xc3 \ xa4 \ xc3 \ x85 \ xc3 \ xa5 \ xc3 \ x89 \ xc3 \ xa3 \ xc3 \ x8d \ xc3 \ xad \ xc3 \ x91 \ xc3 \ xb1 \ xc3 \ x93 \ xc3 \ xb3 \ xc3 \ x96 \ xc3 \ xb6 \ xc3 \ x9a \ xc3 \ xba \ xc3 \ x9c \ xc3 \ xbc \

El problema aquí es que esta cadena parece ser unicode, pero en realidad no lo es, por lo que la cadena anterior se convierte a: “ÃêäÃà© eááááááÂá¡ísima

Descubrí que si interpretaba el valor decodificado de la URL como latin-1 y luego lo decodificaba para UTF-8, obtenía la cadena original correcta.