2012-03-16 49 views
8

Tôi đang cố gắng tạo một REST Api ở Django bằng cách xuất Json. Tôi gặp vấn đề nếu tôi thực hiện một yêu cầu POST bằng cách sử dụng curl trong terminal. Lỗi tôi nhận được làLỗi URL POST Django

Bạn đã gọi URL này qua POST nhưng URL không kết thúc bằng dấu gạch chéo và bạn đã đặt APPEND_SLASH. Django không thể chuyển hướng đến URL cắt giảm trong khi duy trì dữ liệu POST. Thay đổi biểu mẫu của bạn để trỏ đến 127.0.0.1:8000/add/ (lưu ý dấu gạch chéo sau) hoặc đặt APPEND_SLASH = False trong cài đặt Django của bạn.

url.py tôi là

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

và quan điểm của tôi là

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

Tôi biết nó không đưa ra Json nhưng tôi đang gặp vấn đề nêu trên khi tôi thực hiện yêu cầu POST trong thiết bị đầu cuối

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

Tôi chưa quen với django.

Trả lời

15

Trước tiên, hãy đảm bảo rằng bạn gửi yêu cầu đến http://127.0.0.1/add/ không phải http://127.0.0.1/add.

Thứ hai, bạn cũng có thể muốn miễn chế độ xem khỏi xử lý csrf bằng cách thêm trình trang trí @csrf_exempt - vì bạn không gửi mã thông báo thích hợp từ cURL.

+0

Cảm ơn bạn nhiều. @csrf_exempt đã hoạt động – Zabi

14

Để thống nhất URL, Django có cài đặt được gọi là APPEND_SLASH, luôn gắn thêm dấu gạch chéo vào cuối URL nếu nó không được gửi theo cách đó để bắt đầu. Điều này đảm bảo rằng /my/awesome/url/ luôn được phân phát từ URL đó thay vì cả hai /my/awesome/url/my/awesome/url/.

Tuy nhiên, Django thực hiện điều này bằng cách tự động chuyển hướng phiên bản mà không có dấu gạch chéo ở cuối cho dấu gạch chéo ở cuối. Chuyển hướng không mang trạng thái yêu cầu với họ, vì vậy khi điều đó xảy ra, dữ liệu POST của bạn sẽ bị xóa.

Tất cả những gì bạn cần làm là đảm bảo rằng khi bạn gửi POST, bạn gửi nó đến phiên bản có dấu gạch chéo ở cuối.

+0

trong yêu cầu curl của tôi "curl http://127.0.0.1:8000/add/ -db = 2 >> output.html" tôi đang yêu cầu bằng dấu gạch chéo ở cuối nhưng vẫn cho tôi sự cố – Zabi