2013-05-28 14 views
7

Napisałem bardzo mały przykład: przycisk junit, który wysyła żądanie POST z parą wartości:Jak napisać widok Django dla żądania 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> 

Tak, widok jest renderowane, gdy Żądanie GET jest wysyłane do localhost: 8000/button /, a po naciśnięciu przycisku żądanie POST jest również wysyłane do 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') 

Gdy żądanie GET jest zrobione, jest prawidłowo wyświetlany widok i mogę również czytać w Django pocieszyć linie:

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 
... 

Po naciśnięciu przycisku widzę:

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

Ale "OTRZYMANE ZAPYTANIE: POST" nigdy nie jest drukowane. Ani "Hello". Wygląda na to, że urls.py nie wyświetla widoku, gdy przybył POST, ponieważ w Firebug widzę, że status POST jest 403 ZABRONIONY.

To prawdopodobnie głupia nowicjuszka, ale nie wiem, czego mi brakuje. Przeczytałem django book chapter about advanced URLConf and Views i wygląda na to, że powinno działać tylko poprzez sprawdzenie wartości request.method.

+0

Dodaj tokena csrf do szablonu .. – Rajeev

Odpowiedz

8

Jest to zgodne z projektem. Twoje dane POST muszą zawierać wartość csrfmiddlewaretoken. Możesz pobrać z plików cookie, a następnie wysłać go za pomocą żądań POST. Details here. Twoim przypadku, można to zrobić -

<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

Czy możesz podać przykład? Właśnie dodałem wiersz "csrfmiddlewaretoken" = $ .cookie ("csrftoken"), "do zmiennej postdara, a test POST nie jest już wysyłany. –

+0

Zaktualizowana odpowiedź. czek. –

+1

BTW, używając '$ .cookie' wymaga wtyczki cookie jQuery. –

3

Wysłaliśmy do 403 ze względu na ochronę CSRF - nie dostarczyły token. The documentation mówi wszystko, co musisz wiedzieć.

+2

Link niedostępny teraz. Proszę zaktualizować. –

Powiązane problemy