gpt4 book ai didi

django - 如何使用 Django 保护他的 AJAX View ?

转载 作者:行者123 更新时间:2023-12-05 01:08:52 25 4
gpt4 key购买 nike

我在我的 Django 项目中使用私有(private) View 来处理 AJAX 请求。

def HereIsSomeJSON(request, label):
if not request.method == "POST":
raise PermissionDenied
# Here is the job of my AJAX, basically feeding a JSON
json = {...}

return HttpResponse(json, "application/json")
使用 JavaScript,我请求使用 jQuery 的 AJAX,如下所示:
function FeedMeWithJSON() {
// Django needs his Cross-Site Request Forgery token to welome POST datas
oPostDatas = {
'csrfmiddlewaretoken': '{{ csrf_token }}'
};
jQuery.post("/url/to/HereIsSomeJSON", oPostDatas, function(oData, sStatus) {
// Here is the job to be done with the fetched JSON
}, "json");
}
多亏了 request.method,一切正常我在 View 中进行的验证。用户无法手动(通过在浏览器中输入我的 AJAX url)访问我的 View 。
但是,由于我需要更多 AJAX View ,我想知道我是否做对了。所以我想创建一个自定义的 Django 装饰器,我可以在我的每一个 AJAX View 上方使用它。
是保护我的私有(private)意见的好方法吗?如果是这样,我该怎么做?
谢谢,
编辑

显然,这还不够清楚。我正在使用 Django View 来执行 AJAX 请求。但我不希望用户能够输入 URL 来读取数据库内容。我知道人们总是可以使用 curl或类似发送 POST 数据从而绕过我的东西,即使他必须发送正确的 {% csrf_token %} .
另外,在不久的将来登录功能将被实现,我将添加 @login_required装饰师。
谢谢,

最佳答案

您要求 POST 为您的 ajax View 的方法基本上是可以的,并且有一个 existing decorator处理它:

from django.views.decorators.http import require_POST

@require_POST
def my_view(request):
# I can assume now that only POST requests make it this far
# ...
pass

此外,还有一种更简单的方法可以将 CSRF token 添加到您的 jQuery AJAX 调用中,记录在 here 中。 .基本思想是从 cookie 中读取 CSRF token ,并使用 beforeSend $.ajaxSetup 中的选项将其添加到您的所有 $.ajax调用(包括像 $.post 这样的快捷语法)。

由于此代码不依赖于模板变量,因此它不必位于内联 <script> 中。标签。
// using jQuery
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');

function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
crossDomain: false, // obviates need for sameOrigin test
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

关于django - 如何使用 Django 保护他的 AJAX View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16569784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com