在django 1.3中,你现在必须使用csrf甚至是ajax.我使用jquery,现在我想将csrf标记添加到$ .post.我怎样才能做到这一点?我对jquery不是很熟练,所以对于一个很好的描述会很好.
这是一个评级应用程序,点击星标时发送帖子.我见过django文档,但不明白在我的情况下该怎么做.我的代码如下:
$(function() {
$("#avg").children().not(":input").hide();
$("#rating-widget").children().not("select").hide();
$caption = $("<span/>");
$("#avg").stars({captionEl: $caption});
$("#rating-widget").stars({
inputType: "select",
cancelShow: false,
captionEl: $caption,
callback: function(ui, type, value){
--------------> $.post($("#rating-widget").attr("action"), {score: value}, function(data){
});
}
});
$caption.appendTo("#rating-widget");
});
Run Code Online (Sandbox Code Playgroud)
应该说javascript不在模板中,而是在静态文件中.最好将它放在模板中,以便我可以使用{{ csrf_token }}
提前致谢!
我有以下ajax调用来更新模型的特定字段
$("#updateLink").click(function(){
var dec_text = $('#desc_text').val();
$.ajax({
type: "POST",
url:"/users/update_desc/",
data: {
'val': dec_text,
},
success: function(){
$(".display, .edit").toggle();
$("#descText").html(dec_text);
},
error: function(){
alert("Error");
},
});
return false;
});
Run Code Online (Sandbox Code Playgroud)
我的观点是这样的
@csrf_exempt
def update_desc(request):
if request.is_ajax():
if request.method == 'POST':
desc_text = request.POST.get('val', False)
if desc_text:
profile = user.profile
profile.desc = desc_text
profile.save()
return_message = "Sent mail"
return HttpResponse(return_message,mimetype='application/javascript')
Run Code Online (Sandbox Code Playgroud)
我不断收到错误消息,我不知道如何解决这个问题.我甚至使用csrf_exempt装饰器来解决问题,如果问题是由于缺失引起的,csrf token但问题仍然存在.
除了ajax post在我的base模板中所有ajax调用都失败的情况.任何人都可以帮助了解这里发生的事情.如果需要,我可以提供更多细节.
编辑:
我在我的基本模板中添加了一个js包含此https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax的文件,因此这意味着它存在于我的所有模板中.我正在使用django 1.3版本.
我已经启动了新的django项目并启用了管理员应用程序.我可以登录管理站点,但是当我尝试添加/更改站点或用户时,我正在获取
CSRF verification failed. Request aborted.
Reason given for failure:
CSRF token missing or incorrect.
Run Code Online (Sandbox Code Playgroud)
这就是我在settings.py中所拥有的:
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)
Run Code Online (Sandbox Code Playgroud)
当我查看管理页面来源时,我看到了
<input type='hidden' name='csrfmiddlewaretoken' value='T9Mfk1LRXi5jPE2dh5jcvdKwzYM6Iy5I' />
Run Code Online (Sandbox Code Playgroud)
那里
我有Django版本1.4.1
我正在尝试使用动态填充的字段创建Django表单:也就是说,当checkin_type从下拉菜单中选择一个字段()时,其他字段会自动填充相应的数据。为此,一旦选择了下拉选项,我想向服务器发送POST请求。
到目前为止,我已经尝试了以下模板(遵循https://docs.djangoproject.com/en/2.0/ref/csrf/):
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
<script>
$(document).ready(function(){
var csrftoken = Cookies.get('csrftoken');
$(".auto-submit").change(function() {
$.post({
url: "{% url 'get-checkin-type' %}",
data: $(".auto-submit option:selected").val(),
headers: {
X-CSRFToken: csrftoken
}
})
});
});
</script>
<form action="" method="post">{% csrf_token %}
{% for field in form %}
<div class="{% if field.name == 'checkin_type' %}auto-submit{% endif %}">
{{ field.errors }}
{{ field.label_tag }}
{{ field }}
</div>
{% endfor %}
<input type="submit" value="Send message" />
</form>
Run Code Online (Sandbox Code Playgroud)
但是,当我选择一个下拉选项时,
新增:17个未捕获的SyntaxError:意外令牌-
从该X-CSRFToken: csrftoken …
一段时间以来,我一直在尝试从 Vue 前端向 Django 后端发送 POST 或 DELETE 请求。
我在 localhost:3000 上运行 Vue.js,在 localhost:8000 上运行 Django。我已经使用django-cors-headers设置了 CORS ,并且能够获取请求。但是,一旦我尝试删除或发布,就会收到此错误:
Forbidden (CSRF cookie not set.)
据我了解,我需要在请求标头中传递 CSRF 令牌,我有:
deleteImage() {
const url = this.serverURL + 'images/delete/' + this.image_data.pk;
const options = {
method: "DELETE",
headers: {'X-CSRFToken': this.CSRFtoken}
};
fetch(url, options)
.then(response => {
console.log(response);
if (response.ok){
// if response is successful, do something
}
})
.catch(error => console.error(error));
}
Run Code Online (Sandbox Code Playgroud)
我从 GET 请求获取,如果我使用Django 文档this.CSRFtoken 中显示的方法,令牌是相同的。
我的姜戈settings.py看起来像这样:
rom …Run Code Online (Sandbox Code Playgroud) 我们有一个刚刚开始暴露于外部世界的小网站.在大多数情况下,它工作得很好,但我们偶尔会从其中一个表单中收到403错误消息"CSRF FAILURECSRF cookie not set".表单肯定{% csrf_token %}包含,我们的中间件看起来像这样:
MIDDLEWARE_CLASSES = (
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
Run Code Online (Sandbox Code Playgroud)
该表单适用于大多数人,但大约每天一次我收到一封故障案例的电子邮件.电子邮件包含实际请求,看起来像这样(我删除了其余的POST数据以隐藏私人数据,但留下了csrfmiddlewaretoken):
<WSGIRequest
path:/main/10/apply/,
GET:<QueryDict: {}>,
POST:<QueryDict: {u'csrfmiddlewaretoken': [u'IQQZvbVIggJm6Be6VinPHj8Qn3i3TdmG']}>,
COOKIES:{},
META:{'CONTENT_LENGTH': '111978',
'CONTENT_TYPE': 'multipart/form-data; boundary=----WebKitFormBoundaryLyo9BPXnAwKnt8ew',
'CSRF_COOKIE': 'XmSPWJZk2UwS4PNBXRmVlAaYDDdNaGqk',
Run Code Online (Sandbox Code Playgroud)
CSRF_COOKIE与csrfmiddlewaretoken不匹配,这是我假设导致问题的原因,但我无法弄清楚这些是如何与某些提交不同步而不是其他提交.该页面是一个非常简单的表单,只有几个字段.
我应该看哪里的建议?我正在使用mod_wsgi通过apache在CentOS上运行最新的Django 1.4.1.
编辑:与成功的请求相比,唯一看起来奇怪的事情是这里的COOKIES:{}部分是空的,这会让我怀疑他们可能只是在他们的浏览器中禁用了cookie,但是为什么它会出现在CSRF_COOKIE中META部分?
谢谢你的帮助!
布兰登
我正在尝试创建一个包含两个表单的页面:一个在页面加载时可见(一个登录表单),另一个在用户单击按钮(注册表单)时出现在模态中.
我正在使用Django,虽然我仍然在弄清楚如何处理这些表单,但我最关心的是CSRF令牌将如何发挥作用.例如,我应该{% csrf_token %}只使用其中一个<form></form>标签,还是应该将它放在两个标签中?
此外,如果我在两种形式中都使用它,这会以任何方式影响我对服务器的POSTS吗?目前,我正在以一种形式获取数据(取决于单击的提交按钮)并以这种方式进行POST:
var data={
'username':$('#username').val(),
'password':$('#password').val(),
'csrfmiddlewaretoken': '{{ csrf_token }}'
}
$.post("/", signin_data);
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用Django REST框架作为后端的项目(让我们说api.somecompany.com但是有一个React.js前端(at www.somecompany.com)不是由Django提供的,它提出了AJAX请求.
因此,我不能使用Django的传统方法让模板包含这样的CSRF令牌 <form action="." method="post">{% csrf_token %}
我可以向Django REST Framework的api-auth\login\url 发出请求,它会返回这个标题:
Set-Cookie:csrftoken=tjQfRZXWW4GtnWfe5fhTYor7uWnAYqhz; expires=Mon, 01-Aug-2016 16:32:10 GMT; Max-Age=31449600; Path=/- 但是我无法检索这个cookie以发回我的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 + …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Django 1.5中使用我的403,404,500个自定义模板.404和500完美地工作,但403仍然显示我内置的Django 403模板.
我将所有三个模板放在项目的根模板目录中.它们的名称为:403.html,404.html,500.html
我也试过用:
urls.py:
from django.utils.functional import curry
handler403 = curry(permission_denied, template_name='403.html')
Run Code Online (Sandbox Code Playgroud)
还有:urls.py:
handler403 = 'proj_name.views.my_custom_permission_denied_view'
Run Code Online (Sandbox Code Playgroud)
PROJ_NAME/views.py
def my_custom_permission_denied_view(request):
return ethoos_response('403.html', None, request)
Run Code Online (Sandbox Code Playgroud)
两种方法都不起作用.同样在404和500中,我不使用这些方法,只使用模板目录中的模板,并显示它们.
根据Django的文档,这三个假设都以相同的方式工作. https://docs.djangoproject.com/en/1.5/topics/http/views/#the-403-http-forbidden-view
我不知道为什么只有403没有.谢谢.
从localhost机器向远程django api发出POST请求时,我收到CSRF令牌丢失或错误.
我在AngularJS上的设置:
.config(['$httpProvider', function($httpProvider){
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);
Run Code Online (Sandbox Code Playgroud)
但我仍然得到CSRF令牌丢失或不正确的错误.
我检查发送的标题是什么,显然有角度没有发送HTTP_X_CSRFTOKEN.
但我可以看到cookie csrftoken =发送的东西.
有谁知道发生了什么?
请求标题
POST /s/login/ HTTP/1.1
Host: server.somewhere.io:8000
Connection: keep-alive
Content-Length: 290
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
Origin: http://localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost/thesocialmarkt/
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,pt-BR;q=0.4,pt;q=0.2
Cookie: csrftoken=hiYq1bCNux1mTeQuI4eNgi97qir8pivi; sessionid=1nn1phjab5yd71yfu5k8ghdch2ho6exc
Run Code Online (Sandbox Code Playgroud) django ×10
django-csrf ×10
jquery ×4
ajax ×2
csrf ×2
python ×2
angularjs ×1
api ×1
csrf-token ×1
django-1.4 ×1
javascript ×1
post ×1
reactjs ×1
templates ×1
vue.js ×1