通过 jQuery 进行 ajax 调用时出现 403 错误
Posted
技术标签:
【中文标题】通过 jQuery 进行 ajax 调用时出现 403 错误【英文标题】:403 error when making an ajax call through jQuery 【发布时间】:2015-06-17 06:36:14 【问题描述】:这是一个 Django 项目,我必须编写一个在线商店。 在我的 html 中,我有一个 ID 为“search”的表单,我在我的 ajax 代码中使用这个 'id' 来搜索并与我创建的日期库进行比较。最后它必须在屏幕上显示我的可能数据像谷歌查找器一样的日期库。我的大问题是 CSRF,在我的控制台中: “发布/搜索/HTTP/1.1”403 2295 我在此页面上看到有人遇到同样的问题,但我不知道失败在哪里。
这是我的 ajax 代码:
$("#search").keyup(function()
var cadena = $("#search").val();
var csrf = $("input[name=csrfmiddlewaretoken]").val();
var token = $('input[name=""__RequestVerificationToken""]').val();
if ( cadena.length > 2)
alert(cadena);
$.ajax(
type:"POST",
url: "http://127.0.0.1:8000/search/",
data:'search_text':cadena,
''csrfmiddlewaretoken' : csrf,
success:function(respuesta)
$('#search-results').html(respuesta);
);
);
);
我的模板(html):
<td>
% csrf_token %
<input type="text" id="search" placeholder="Search"/>
<ul id ="search-results"></ul>
</td>
我的意见.py:
定义搜索标题(请求):
if request.method == "POST":
search_text = request.POST['search_text']
libros1 = Libros.objects.filter(nombre__contains=search_text)
print("asda");
else:
search_text =''
libros1 = Libros.objects.filter(nombre__contains=search_text)
return render('ajax_search.html','libros':libros1)
我的网址:
url(r'^admin/',include(admin.site.urls)),
url(r'^$', 'views.home'),
url(r'^(search)/', 'views.search_title'),
url(r'^(libros)/', 'views.libros'),
url(r'^(carrito)/', 'views.carrito')
在我的控制台中:
warnings.warn("模板中使用了% csrf_token %,但上下文没有提供值。这通常是由于没有使用RequestContext造成的。")
【问题讨论】:
您可以从浏览器的调试工具栏(例如for chrome)更轻松地调试 AJAX 活动。这将允许您检查来自服务器的确切响应和错误详细信息。 【参考方案1】:Luca 的回答应该可以解决您的问题。我想分享一下我通常如何实现 AJAX POST 请求。我在模板(html)文件中编写 jQuery 代码。
我知道这不是最佳做法,但这样做可以让我
使用% url %
标签而不是在js文件中硬编码url。
使用 csrf_token
而不是从
隐藏的输入字段。
通常,我的 base.html 文件中有一个名为 extrajs 的块(我在每个模板上扩展的那个)。
现在每当我需要包含 AJAX 功能时,我就是这样做的
% block extrajs %
<script>
...
$.ajax(
...
url:'% url "app_name.views.func_name" %',
data: ... ,'csrfmiddlewaretoken':' csrf_token ', ... ,
...
);
</script>
% endblock %
【讨论】:
我已经尝试过你的答案,但我遇到了这个问题:“tienda.views.search_title”的反向参数“()”和关键字参数“”未找到。尝试了 0 个模式:[] 你能发布你的 urls.py 文件吗 之前我也写过 url:'% url 'app_name.views.func_name' %' .... 我已将其更正为 url:' % url "app_name.views.func_name" %' 我使用 firefox 调试发布了我的 urls.py.Im,它检测到 url 中的失败【参考方案2】:我的建议是您应该确保 csrf 令牌关键字与处理它的中间件内联(在您的 ajax 中它是 csrtoken
)。在我的 django 应用程序中,令牌称为 csrfmiddlewaretoken
。
ajax 发布请求应如下所示:
$.ajax(
type:"POST",
url: "http://127.0.0.1:8000/search/",
data:'search_text':cadena,
'csrfmiddlewaretoken' : csrf,
success:function(respuesta)
$('#search-results').html(respuesta);
【讨论】:
我改了,结果还是一样 @AlbitaVadillo 我在谈论您的 ajax 发布请求的数据部分中的“csrtoken”。 我也是这样,不知道为什么不行,你觉得可能是电脑问题?在控制台中我得到:warnings.warn("A % csrf_token % was used in a template, but context does not provide the value.这通常是由于没有使用 RequestContext.") 您是否将 'django.middleware.csrf.CsrfViewMiddleware' 添加到设置文件 MIDDLEWARE_CLASSES 部分? 试试这个:在你的views.py的最后一行,做return render(request, 'ajax_search.html','libros':libros1)
以上是关于通过 jQuery 进行 ajax 调用时出现 403 错误的主要内容,如果未能解决你的问题,请参考以下文章
在 ajax 调用 Mvc-4 应用程序中实现验证时出现错误