¿Cómo hacer una API Django-Rest-Framework que tome datos POST?

Estoy creando una aplicación Django con las API de Django-Rest-Framework. He construido un punto final de la API de la siguiente manera. Quiero poder POSTAR datos desde mi navegador. Quiero recuperar un modelo de objeto de mi base de datos que tenga el primario correspondiente como se indica en la URL. Y quiero operar con ese objeto recuperado en base a los datos publicados por el navegador. Si pudiera tomar los datos publicados con mi ViewSet, estaría listo. Pero no sé cómo ejecutar la función update () de ese conjunto de vistas cuando hago una POST.

De mi archivo urls.py:

router.register(r'replyComment', views.ReplyComment, base_name="replyComment") 

De mi archivo views.py:

 class ReplyComment(viewsets.ViewSet): def update(self,request,pk=None): try: origComment = Comment.objects.get(pk=pk) # Do something here that modifies the state of origComment and saves it. return Response( json.dumps(True), status=status.HTTP_200_OK, ) except Exception as exception: logger.error(exception) return Response(status=status.HTTP_400_BAD_REQUEST) 

Estoy usando la herramienta Advanced Rest Client (ARC) en mi navegador Chrome. Cuando apunto la herramienta ARC a http://127.0.0.1:3001/api/replyComment/2/ usando el método POST, recibo el error:

 { detail: "CSRF Failed: CSRF token missing or incorrect". } 

Vea la captura de pantalla aquí . Parece que estoy haciendo algo mal aquí con mi POST. ¿Alguien por favor puede aconsejar cómo hacerlo correctamente? ¿Cómo puedo solucionar mi problema CSRF? Soy un novato en Django Rest Frameworks. Así que si puede proporcionar detalles claros, sería más apreciado. Por favor, hágame saber qué cambios debo hacer para garantizar que mi POST funcione como lo bash. Necesito un poco más de ayuda que simplemente remitiéndome al manual. (Intenté eso pero todavía no pude hacerlo funcionar)

Se requieren Tokens CSRF en Django para protegerse contra CSRF (falsificación de solicitud entre sitios). Para los métodos que escriben algo (POST, PUT, DELETE, etc.), debe incluir un token CSRF con su solicitud para que Django sepa que la solicitud provino de su propio sitio.

Puedes leer más sobre la documentación de Django-rest-framework . Y como se indica en el documento, puede encontrar cómo incluir el token CSRF en el encabezado HTTP en la documentación de Django .

Bien. Otras respuestas son correctas. pero supongo que tu problema es que no sabes cómo usar estas respuestas.

Aquí hay un ejemplo. digamos que quiero enviar un name campo con la función jquery ajax sobre el método PUT (actualizar el nombre en un modelo).

Primero deberíamos obtener el csrf-token del servidor de cookies. esta función de la documentación de django hace el trabajo (obteniendo algún valor de la cookie):

 // using jQuery function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } 

cuando enviemos una solicitud de put , enviaremos el token csrf en el encabezado de la solicitud :

 var jqxhr = $.ajax('/rest/gallery/5/', { method: 'PUT', type: 'PUT', beforeSend: function (xhr) { xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')) }, data: { name: 'salam dadash' } }); jqxhr.done(function (result) { console.log(result); }); 

tenga en cuenta que antes de beforeSend establezca X-CSRFToken para que csrf-token se envíe en el encabezado de la solicitud.

Usted debe cambiar la url y los data por supuesto.

¿Ver el campo Encabezados sobre la carga útil?

Intenta agregar esto:

 {"X-CSRFToken": "gZvnzSFeGp7h68WjCzmFky6wMkiJZXDU"} 

Vi la captura de pantalla y entrecerré los ojos tratando de leer el token CSRF que has establecido en tu servidor. Por lo que podría estar equivocado, verifíquelo contra su archivo settings.py. Bibhas es correcto, pero así es como se logra una POST con ARC en su navegador.