2012-03-16 23 views
8

Estoy tratando de hacer un REST Api en Django dando salida a Json. Tengo problemas si hago una solicitud POST usando curl en la terminal. El error que consigo esDjango POST URL error

Se llama este URL a través de la POST, pero la URL no finalizar con una barra y tiene SET APPEND_SLASH. Django no puede redireccionar a la URL de barra mientras mantiene los datos POST. Cambie su formulario para que apunte a 127.0.0.1:8000/add/ (observe la barra al final), o configure APPEND_SLASH = False en la configuración de Django.

Mi url.py es

from django.conf.urls.defaults import patterns, include, url 
import search 

# Uncomment the next two lines to enable the admin: 
# from django.contrib import admin 
# admin.autodiscover() 

urlpatterns = patterns('', 

    url(r'^query/$', 'search.views.query'), 
    url(r'^add/$','search.views.add'), 
) 

y mis puntos de vista son

# Create your views here. 
from django.http import HttpResponse 
from django.template import Context,loader 
import memcache 
import json 

def query(request): 
    data=['a','b'] 

    mc=memcache.Client(['127.0.0.1:11221'],debug=0) 
    mc.set("d",data); 

    val=mc.get("d") 

    return HttpResponse("MEMCACHE: %s<br/>ORIGINAL: %s" % (json.dumps(val),json.dumps(data))) 

def add(request): 
    #s="" 
    #for data in request.POST: 
    # s="%s,%s" % (s,data) 
    s=request.POST['b'] 
    return HttpResponse("%s" % s) 

Sé que no es dar JSON pero estoy teniendo el problema antes mencionado cuando hago la solicitud POST en terminal

curl http://127.0.0.1:8000/add/ -d b=2 >> output.html 

Soy nuevo en django though.

Respuesta

15

Primero, asegúrese de enviar la solicitud al http://127.0.0.1/add/ no http://127.0.0.1/add.

En segundo lugar, es posible que también desee eximir la vista del procesamiento de csrf agregando el decorador @csrf_exempt, ya que no está enviando el token apropiado de cURL.

+0

Gracias a mucho. El @csrf_exempt funcionó – Zabi

14

Para consistencia de URL, Django tiene una configuración llamada APPEND_SLASH, que siempre agrega una barra al final de la URL si no se envió de esa manera para comenzar. Esto garantiza que /my/awesome/url/ siempre se sirve desde esa URL en lugar de /my/awesome/urly/my/awesome/url/.

Sin embargo, Django hace esto redireccionando automáticamente la versión sin la barra al final de la barra con la barra al final. Los redireccionamientos no llevan consigo el estado de la solicitud, por lo tanto, cuando eso sucede, se eliminan los datos POST.

Todo lo que necesita hacer es asegurarse de que cuando envíe su POST, lo envíe a la versión con la barra al final.

+0

en mi curl request "curl http://127.0.0.1:8000/add/ -db = 2 >> output.html" lo estoy solicitando con una barra al final, pero todavía me da problema – Zabi