我正在学习使用Django Rest Framework并遵循本教程。我已经根据教程创建了一个简单的索引,它适用于GET,但不适用于POST:
@api_view(['GET','POST'])
def game_list(request):
if request.method == 'GET':
games = Game.objects.all()
serializer = GameSerializer(games, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = GameSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我将默认设置设为AllowAny
:
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny'
]
}
但是当我尝试POST
使用Firefox RESTClient时,我仍然会收到HTTP 403。 I read我必须添加X-CSRFToken
标题和Cookie才能生效,但我没有。
答案 0 :(得分:0)
来自文档:
默认情况下,如果传入请求未通过CsrfViewMiddleware执行的检查,则会向用户发送“403 Forbidden”响应。这通常只有在存在真正的跨站点请求伪造时才会出现,或者由于编程错误而导致POSTF表单中未包含CSRF令牌时。
此外,正如官方文档所述,默认情况下启用了CSRF,并且您需要在AJAX请求中添加X-CSRFToken。
以下是文档中的代码:
// 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));
}
请记住,文档建议使用jquery中的ajaxSetup方法,这不是推荐的方法,因为它可以改变其他脚本使用ajax函数的方式,因此最好添加特定的CSRF代码。您的自定义JS代码如下:
$.ajax({
method: 'POST',
url: 'your.url.com/',
beforeSend: function(xhr, settings) {
if (!WU._csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
success: function(msg)
{}
});