18

我写了一个非常小的例子:一个 junit 按钮,它发送一个带有一对值的 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>

因此,当一个 GET 请求被发送到 localhost:8000/button/ 时,视图被渲染,当按下按钮时,一个 POST 请求也被发送到 localhost:8000/button/。

网址.py

from django.conf.urls import patterns, url

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

视图.py

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

完成 GET 请求后,视图正确显示,我还可以在 Django 控制台中读取以下行:

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

当按下按钮时,我可以看到:

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

但是永远不会打印“收到的请求:POST”。“你好”也不是。当 POST 到达时,似乎 urls.py 没有提供视图,因为在 Firebug 中我可以看到 POST 状态为 403 FORBIDDEN。

这可能是一个愚蠢的新手错误,但我不知道我错过了什么。我已经阅读了关于高级 URLConf 和 Views 的 django 书籍章节,看起来它应该只通过检查 request.method 值来工作。

4

2 回答 2

13

这是设计使然。您的 POST 数据必须包含csrfmiddlewaretoken值。您可以从 cookie 中获取它,然后使用 POST 请求发送它。详情在这里。对于您的具体情况,您可以这样做 -

<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>
于 2013-05-28T10:44:14.877 回答
4

由于 CSRF 保护,您收到 403 - 您没有提供令牌来保护自己免受攻击。文档告诉你所有你需要知道的。

于 2013-05-28T10:44:22.473 回答