2013-05-28 23 views
7

Tôi đã viết một ví dụ rất nhỏ: một nút junit mà sẽ gửi một yêu cầu POST với một cặp giá trị:Làm thế nào để viết một cái nhìn Django cho một yêu cầu POST

<!doctype html> 

<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>jQuery UI Button - Default functionality</title> 
    <script src="{{STATIC_URL}}js/jquery-1.9.1.js"></script> 
    <script src="{{STATIC_URL}}js/jquery-ui-1.10.3.custom.js"></script> 
    <link rel="stylesheet" href="{{STATIC_URL}}css/jquery-ui-1.10.3.custom.css"> 

    <script> 
    $(function() { 
    $("button") 
     .button() 
     .click(function(event) { 
     var postdata = { 
      'value1': 7, 
      'value2': 5 
     }; 
     $.post('', postdata); // POST request to the same view I am now 
     window.alert("Hello world!"); // To know it is working 
     }); 
    }); 
    </script> 
</head> 
<body> 

<button>Submit</button> 


</body> 
</html> 

Vì vậy, quan điểm được hiển thị khi một Yêu cầu GET được gửi đến localhost: 8000/button/và khi nút được đẩy, yêu cầu POST cũng được gửi tới localhost: 8000/button /.

urls.py

from django.conf.urls import patterns, url 

urlpatterns = patterns('', 
    url(r'^button/$', 'helloworld.views.buttonExample'), 
    ) 

views.py

def buttonExample(request): 
    print 'RECEIVED REQUEST: ' + request.method 
    if request.method == 'POST': 
     print 'Hello' 
    else: #GET 
     return render(request, 'buttonExample.html') 

Khi yêu cầu GET được thực hiện, quan điểm được hiển thị một cách chính xác và tôi cũng có thể đọc tại Django an ủi các dòng:

RECEIVED REQUEST: GET <---- This line is because of my print 
[28/May/2013 05:20:30] "GET /button/ HTTP/1.1" 200 140898 
[28/May/2013 05:20:30] "GET /static/js/jquery-1.9.1.js HTTP/1.1" 304 0 
[28/May/2013 05:20:30] "GET /static/js/jquery-ui-1.10.3.custom.js HTTP/1.1" 304 0 
[28/May/2013 05:20:30] "GET /static/css/jquery-ui-1.10.3.custom.css HTTP/1.1" 304 0 
... 

Và khi nút được đẩy, tôi có thể thấy:

[28/May/2013 05:20:34] "POST /register/ HTTP/1.1" 403 142238 

Nhưng "KHÔNG ĐƯỢC YÊU CẦU YÊU CẦU: BÀI ĐĂNG" không bao giờ được in. Không phải là "Xin chào". Có vẻ như urls.py không phục vụ chế độ xem khi POST đến, vì trong Firebug tôi có thể thấy trạng thái POST là 403 FORBIDDEN.

Đây có lẽ là một lỗi người mới ngớ ngẩn, nhưng tôi không biết mình đang thiếu gì. Tôi đã đọc django book chapter about advanced URLConf and Views và có vẻ như nó chỉ hoạt động bằng cách kiểm tra giá trị request.method.

+0

THÊM mã thông báo csrf vào mẫu ur .. – Rajeev

Trả lời

8

Đây là theo thiết kế. Dữ liệu POST của bạn phải chứa csrfmiddlewaretoken giá trị. Bạn có thể lấy nó từ cookie của bạn và sau đó gửi nó với yêu cầu POST. Details here. Đối với trường hợp của bạn, bạn có thể làm điều này -

<script> 
$(function() { 
    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; 
    } 
    var csrftoken = getCookie('csrftoken'); 

    $("button") 
     .button() 
     .click(function (event) { 
      var postdata = { 
       'value1': 7, 
       'value2': 5, 
       'csrfmiddlewaretoken': csrftoken 
      }; 
      $.post('', postdata); // POST request to the same view I am now 
      window.alert("Hello world!"); // To know it is working 
     }); 
}); 
</script> 
+0

Bạn có thể cung cấp ví dụ không? Tôi vừa thêm dòng 'csrfmiddlewaretoken' = $ .cookie ('csrftoken') 'vào biến postdara và POST không được gửi thêm nữa –

+0

Câu trả lời được cập nhật. kiểm tra. –

+1

BTW, sử dụng '$ .cookie' yêu cầu plugin cookie jQuery. –

3

Bạn nhận được 403 vì bảo vệ CSRF - bạn chưa cung cấp mã thông báo. The documentation cho bạn biết tất cả những gì bạn cần biết.

+2

Liên kết hiện không khả dụng. Vui lòng cập nhật. –

Các vấn đề liên quan