how - django rest framework vs django
django-rest-framework http no funciona con 415 en django 1.5 (1)
Está absolutamente en el camino correcto: la prueba de ruptura en ese caso se debe sin duda al cambio de Django en el comportamiento de PUT
para el cliente de prueba.
Tu corrección también me parece bien. 415 es la respuesta "Tipo de medio no admitido", lo que significa que el tipo de contenido de solicitud no era algo que pudiera ser manejado por ninguno de los analizadores configurados para la vista.
Normalmente, en un caso como este, eso se debe a que olvidaste establecer el tipo de contenido de la solicitud, pero parece que lo tienes configurado correctamente en multipart/form-data; boundary=...
multipart/form-data; boundary=...
Cosas para verificar:
- ¿Qué muestra
response.data
como los detalles del error? - ¿Qué has configurado en tu configuración
DEFAULT_PARSER_CLASSES
, si tienes una, o qué has configurado en el atributo de vistaparser_classes
si tiene una? - Asegúrese de que no haya un error tipográfico en
content_type
en la prueba (aunque es correcto aquí).
Editar :
Gracias por sus comentarios; eso lo aclara todo. Solo tiene instalado el analizador JSON, pero está intentando enviar datos codificados. Usted debe:
- Agregue
FormParser
yMultiPartParser
a su configuración / vista, para que admita codificaciones de forma. (Tenga en cuenta también que la configuración predeterminadaDEFAULT_PARSER_CLASSES
incluye, por lo que si no establece nada, funcionará como se esperaba)
O
- Codifique la solicitud utilizando la codificación
json
, no la codificación de la forma ...data=json.dumps(prepare_dict(self.account)), content_type=''application/json''
en su caso de prueba.
Estoy usando django-rest-framework (último) para REST API, e implementado algunos casos de prueba en django usando el cliente de prueba integrado.
El siguiente caso de prueba django funcionaba bien con la versión de django <1.5
self.client.put(''/core/accounts/%s/''% self.account.id,
data = prepare_dict(self.account),
HTTP_AUTHORIZATION=self.token)
actualizado a django 1.5, todas las pruebas están pasando, excepto las pruebas relacionadas con HTTP PUT mientras se investiga el problema encontrado en este @ https://docs.djangoproject.com/en/dev/releases/1.5/#options-put-and-delete- requests-in-the-test-client
Si estaba utilizando el parámetro de datos en una solicitud PUT sin content_type, debe codificar sus datos antes de pasarlos al cliente de prueba y establecer el argumento content_type.
Por lo tanto, actualicé mi prueba para reflejar este cambio e intenté seguirla, pero aun así obtuve http 415 en lugar de http 200
from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart
self.client.put(''/core/accounts/%s/''% self.account.id,
data = encode_multipart(BOUNDARY, prepare_dict(self.account)),
content_type=MULTIPART_CONTENT,
HTTP_AUTHORIZATION=self.token)
¿Alguna idea de lo que me estoy perdiendo? PD: toda la funcionalidad funciona bien desde la interfaz de usuario web incorporada django-rest-framework