如何为POST请求编写Django视图

发布于 2021-01-29 17:20:00

我写了一个非常小的示例:一个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 /。

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

完成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”。“
Hello”也不是。POST到达时,似乎urls.py没有提供视图,因为在Firebug中,我可以看到POST状态为403 FORBIDDEN。

这可能是一个愚蠢的新手错误,但我不知道我缺少什么。我已经阅读了有关高级URLConf和Viewsdjango书籍章节,看起来仅通过检查request.method值就可以正常工作。

关注者
0
被浏览
166
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是设计使然。您的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>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看