我在Linux上开发了我的应用程序,并且AJAX请求工作正常。我已经将应用程序拉到Windows机器上,但是AJAX请求失败,我刚收到403Forbidden错误。从网上看,我认为这是csrf令牌的问题。在Linux中,我可以csrftoken:"AjQzJy3tRZ2awslgdibkDTvQgANFQKmP"在AJAX请求的Cookies下看到。我没有在Windows中设置任何cookie。
csrftoken:"AjQzJy3tRZ2awslgdibkDTvQgANFQKmP"
这是我用来获取csrf cookie的Javascript代码。来自https://docs.djangoproject.com/en/1.8/ref/csrf/
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; }
这是我提交AJAX请求的地方:
function refreshInformation(){ $.ajax({ type: "POST", url: "get_flows_info", data: { csrfmiddlewaretoken: getCookie('csrftoken') } dataType : "json", async : true, error : function(data){ alert('AJAX error:' + data); }, success : function(json_data){ // do stuff... }, }); }
这是所请求的视图:
def get_flows_info(request): if request.is_ajax(): # do stuff... return HttpResponse(json.dumps(ret), content_type='application/json')
有什么帮助吗?
谢谢。
这是可以做的:
请参阅CSRF_COOKIE_NAME以获取更多信息。
CSRF_COOKIE_NAME
ensure_csrf_cookie
根据文档:
警告 如果您的视图未呈现包含csrf_tokentemplate标签的模板,则Django可能未设置CSRF令牌cookie。在将表单动态添加到页面的情况下,这很常见。为了解决这种情况下,Django提供这迫使设置cookie的视图修饰:ensure_csrf_cookie()。
警告
如果您的视图未呈现包含csrf_tokentemplate标签的模板,则Django可能未设置CSRF令牌cookie。在将表单动态添加到页面的情况下,这很常见。为了解决这种情况下,Django提供这迫使设置cookie的视图修饰:ensure_csrf_cookie()。
csrf_token
ensure_csrf_cookie()
csrftoken
X-CSRFToken
$.ajax({ // Your options here. headers: {'X-CSRFToken': getCookie('csrftoken')}
});
阅读跨站点请求伪造保护以获取更多信息。