2011-02-14 10 views
43

Me gustaría seguir el patrón RESTful para mi nuevo proyecto django, y me gustaría saber dónde están los parámetros cuando se realiza una solicitud PUT/DELETE.Django - ¿Dónde se almacenan los parámetros en una solicitud PUT/DELETE?

Por lo que sé, solo veo OBTENER & POST QueryDict en la solicitud, no otros. ¿Django agrega un nuevo PUT o DELETE QueryDict con respecto a la solicitud, o agrega los parámetros a GET o POST QueryDict?

Gracias por su ayuda.

Respuesta

38

asumo lo que estás preguntando es si se puede tener un método como este:

def restaction(request, id): 
    if request.method == "PUT": 
     someparam = request.PUT["somekey"] 

La respuesta es no, no se puede. Django no construye dichos diccionarios para solicitudes PUT, OPTIONS y DELETE, explicando el razonamiento here.

Para resumirlo, el concepto de REST es que los datos que intercambia pueden ser mucho más complicados que un simple mapa de claves de valores. Por ejemplo, PONER una imagen, o usar json. Un marco no puede conocer las muchas formas en que podría desear enviar datos, por lo que hace lo obvio: dejarte manejar ese bit. Vea también la respuesta al this question donde se da la misma respuesta.

Ahora, ¿dónde encuentras los datos? Bueno, según el docs, django 1.2 presenta request.raw_post_data. Como aviso previo, it looks like django 1.3 will supportrequest.read() es decir, semántica similar a un archivo.

+1

A partir de Django 1.4, '' request.raw_post_data'' ha cambiado de nombre '' petición.body'', y '' raw_post_data'' se eliminó en Django 1.6. – user85461

+0

En realidad, puede hacer que Django maneje las solicitudes PUT y DELETE como desee. Aquí puede encontrar un [enfoque posible] (https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/). – baxeico

12

La respuesta de Ninefiger es correcta. Sin embargo, hay soluciones para eso.

Si está escribiendo una API de estilo REST para un proyecto Django, le sugiero que use tastypie. Se ahorrará toneladas de tiempo y le garantizará un formulario más estructurado a su API. También puede ver cómo lo hace el tastypie (acceder a los datos PUT y DELETE).

+0

Gracias por el enlace, voy a echar un vistazo! :) –

+0

+1 de mí, buen consejo. –

5

se puede ver un ejemplo de la obtención de un QueryDict de un método PUT en django-piston's code (Véase el método coerce_put_post)

74

estoy usando v1.5 Django. Y utilizo principalmente QueryDict para resolver el problema:

from django.http import QueryDict 
put = QueryDict(request.body) 
description = put.get('description') 

y en * .coffee

$.ajax 
     url: "/policy/#{policyId}/description/" 
     type: "PUT" 
     data: 
     description: value 
     success: (data) -> 
     alert data.body 
     fail: (data) -> 
     alert "fail" 

se puede ir here para encontrar más información. Y espero que esto te pueda ayudar. Buena suerte :)

+4

Para las versiones modernas de Django, esto es mucho más útil que la respuesta aceptada. – CmdrMoozy

+0

Cuando lo pongo = QueryDict (request.body) se imprime como: Es como si estuviera guardando los datos que estoy enviando como clave. –

+0

Algo como "request.META.get ('REQUEST_METHOD', ''). Upper()" no nos dará 'PUT' o 'DELETE' como se menciona en https://gist.github.com/g00fy-/1161423? –

1

Hubo un problema que no pude resolver cómo analizar multipart/form-data de request. QueryDict(request.body) no me ayudó.

Entonces, he encontrado una solución para mí. Empecé a usar esto:

from django.http.multipartparser import MultiPartParser

Puede obtener datos de request como:

MultiPartParser(request.META, request, request.upload_handlers).parse() 
+1

Esto funciona en Django1.11. Gracias. –

Cuestiones relacionadas