我正在通过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
答案 0 :(得分:0)
您没什么问题。
form
。您的表单与method=GET
一起使用,它将在提交时发送get请求。因此,只需删除表单或在提交中添加return false
。或只需添加带有ID的e.preventDefault()
。我将使用这种方式进行编辑。
在您的Ajax中添加csrfmiddlewaretoken
。
使用{% url %}
更改您的网址。也许{% url 'help' %}
(您必须设置自己的网址)
也可以在接受ajax返回后添加success
或error
。我仅举一个例子。然后,您将从视图中发送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)