2012-03-16 72 views
8

我想通過輸出Json在Django中創建一個REST Api。如果我在終端中使用curl發出POST請求,我遇到了問題。我得到的錯誤是Django POST URL錯誤

您通過POST叫這個URL,但URL不以斜線結束, 你有APPEND_SLASH集。 Django無法在保留POST數據的同時重定向到斜槓URL 。將您的表單更改爲指向 127.0.0.1:8000/add/(注意尾部斜槓),或在您的Django設置中設置APPEND_SLASH = False。

我url.py是

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'), 
) 

和我的看法是

# 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) 

我知道它不是讓Json的,但我在上面提到的問題,當我作出POST請求終端

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

雖然我是新的django。

回答

15

首先,請確保您將請求發送到http://127.0.0.1/add/而不是http://127.0.0.1/add

其次,您可能還希望通過添加@csrf_exempt修飾符來免除csrf處理中的視圖 - 因爲您沒有從cURL發送適當的標記。

+0

謝謝許多。 @csrf_exempt工作 – Zabi 2012-03-18 19:26:20

14

對於URL一致性,Django具有一個名爲APPEND_SLASH的設置,如果它不是以這種方式開始發送的,則始終會在URL末尾附加斜線。這確保/my/awesome/url/始終由該URL提供,而不是從/my/awesome/url/my/awesome/url/

但是,Django通過自動重定向版本而不使用末尾的斜線,最後使用斜線。重定向不會將請求的狀態與它們一起攜帶,因此發生這種情況時,您的POST數據將被丟棄。

您只需確保在發送POST時,將其發送到最後帶有斜線的版本。

+0

在我的捲曲請求「curl http://127.0.0.1:8000/add/ -db = 2 >> output.html」我要求在最後用斜線但它仍然給我的問題 – Zabi 2012-03-16 14:58:21