【问题标题】:Sending Ajax Request to Django向 Django 发送 Ajax 请求
【发布时间】:2013-12-13 11:32:29
【问题描述】:

我对 Ajax 和 Django 还很陌生,我正在尝试向一个名为“update”的函数发送一个简单的 ajax 请求。但我也不希望在发送请求时更改浏览器中的实际 url(例如 www.website.com/page/ 即使使用 ajax 请求也会保持不变)。基本上,当我尝试提交 ajax 请求时,我从服务器收到 403 错误。我相信我的部分问题可能是 urls.py 中的 url 映射...

这是我的 ajax 请求:

$.ajax({
   type : "POST",
   url : "/page/update/",
   data : {
        data : somedata,
    },
}).done(function(data){
        alert(data);
});

这是它应该得到的视图:

def update(request):
    if request.is_ajax():
        message = "Yes, AJAX!"
    else:
        message = "Not Ajax"

    return HttpResponse(message)

这是我的 urls.py

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^update/$', views.update, name='update'),
)

提前感谢您的帮助。

我对错误和需要包含的错误状态进行了更深入的研究 {% csrf_token %} 发回帖子时。此示例how to get POST data in django 1.3 显示它已放入表单中,但我的请求仅在单击功能上调用

【问题讨论】:

  • 那么问题是什么?一件事 - 你在 if request.is_ajax() 中的缩进很不正确
  • 我刚刚更新了问题,每次尝试提交请求时基本上都会收到404错误
  • 那么,/page/ 是否为您提供index 视图?
  • 啊,那大概是CSRF保护吧。尝试使用 Ajax GET 请求而不是 POST,如果您只是检索数据,这更合适。如果您确实需要发布,请阅读以下内容:docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
  • @user1186173 现在,使用 @csrf_exempt 装饰器。一旦你熟悉了 ajax 请求,你就可以删除装饰器,并以正确的方式进行操作——这是 peter 推荐的

标签: python ajax django


【解决方案1】:

您在 ajax 请求“/page/update/”中的 url 与 urls.py 不匹配。这就是您收到 404 错误页面的原因。我会告诉你我的线路代码你可以试试这个。

 $.ajax({
    type: "POST",
    url: "/update/"
    data: {
        csrfmiddlewaretoken: '{{ csrf_token }}',
        data : somedata,
    },
    success: function(data) {
        alert(data);
    },
    error: function(xhr, textStatus, errorThrown) {
        alert("Please report this error: "+errorThrown+xhr.status+xhr.responseText);
    }
});

/*'{{ csrf_token }}' 专门用于 django*/

这是观点:

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt //You can use or not use choice is left to you
def update(request):
    if request.is_ajax():
        message = "Yes, AJAX!"
    else:
        message = "Not Ajax"

    return HttpResponse(message)

这是 urls.py

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^update/$', views.update, name='update'),
)

【讨论】:

  • 在 django 2.0 中会是什么样子?
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多