AJAX Post抛出“ Broken Pipe”并导致GET

时间:2018-07-12 07:38:59

标签: django

我正在通过AJAX向Django服务器发送POST请求,在收到django的POST请求后,它引发“ Broken Pipe error”(断管错误),还向相同的url发起GET请求,但搜索“ csrfmiddlewaretoken”。这正常吗?如何避免GET请求?

 [script]

<script src="{% static 'js/jquery-3.3.1.min.js' %}"></script>
<script src="{% static 'js/js_cookie.js' %}"></script>
<script src="{% static 'js/csrf.js' %}">
</script>
<script>
function myfunc(){
    $.ajax({
        url: "help",
        type: 'POST',
        data: {
            "hello": "hello",
        },
    })
}
</script>

[views.py]
def help_view(request):
if request.method == 'GET':
    return render(request, 'jsnapy_wizard/help.html')
if request.method == 'POST':
    print request.POST
    return render(request, 'jsnapy_wizard/help.html')

[urls.py]
urlpatterns = [
url(r'help', help_view, name='help'),

Error

<QueryDict: {u'hello': [u'hello']}>
[12/Jul/2018 07:17:37] "POST /help HTTP/1.1" 200 670
[2018-07-12 07:17:37,677] - Broken pipe from ('127.0.0.1', 49808)

[12/Jul/2018 07:17:37] "GET /help?csrfmiddlewaretoken=nPvGEmGRGLhzGi7X3zRDFhElKLOaMR1CQbZoUA5lwPCCWbdkyVFEPLeE4vzfQ9pC HTTP/1.1" 200 670

1 个答案:

答案 0 :(得分:0)

您没什么问题。

  1. 如果只想发送ajax,则不必使用form。您的表单与method=GET一起使用,它将在提交时发送get请求。

因此,只需删除表单或在提交中添加return false。或只需添加带有ID的e.preventDefault()。我将使用这种方式进行编辑。

  1. 在您的Ajax中添加csrfmiddlewaretoken

  2. 使用{% url %}更改您的网址。也许{% url 'help' %}(您必须设置自己的网址)

  3. 也可以在接受ajax返回后添加successerror。我仅举一个例子。然后,您将从视图中发送JsonResonpse,而不渲染整个模板。

    <body> 
        <form> 
            {% csrf_token %} 
            <label for="test">Input</label> 
            <input type="text" id="test"> 
            <button type="submit" id="ajaxBtn">Submit</button>
        </form> 
        <script> 
        function myfunc(){
            $.ajax({
                url: "{% url 'help' %}",
                type: 'POST',
                data: {
                    "hello": "hello",
                    "csrfmiddlewaretoken": "{{ csrf_token }}"
                },
                success: function(response) {
                    console.log(response);
                },
                error: function(rs, e) {
                    console.log(e);
                }
            })
        }
        $(document).ready(function(){
            $('#ajaxBtn').click(function(e){
                e.preventDefault();
                myfunc();
            })
        })
        </script> 
    </body>
    

您认为

def help_view(request):
    if request.method == 'GET':
        return render(request, 'jsnapy_wizard/help.html')
    if request.method == 'POST':
        # make sure that 'POST' and 'ajax' is different
        if request.is_ajax():
            print 'ajax work'
            data = {
                'your_data': 'your_data_example',
            }
            return JsonResponse(data)