的AoA 我是Django的新手,我正试图从POST获取数据,但是没有设置错误CSRF cookie,我尝试了很多通过google在google和stackoverflow上找到解决方案,但是失败了
这是代码
from django.http import HttpResponse
from django.template.loader import get_template
from django.template import Context
from django.template import RequestContext
from django.core.context_processors import csrf
from django.shortcuts import render_to_response
def search_Post(request):
if request.method == 'POST':
c = {}
c.update(csrf(request))
# ... view code here
return render_to_response("search.html", c)
def search_Page(request):
name='Awais you have visited my website :P'
t = get_template('search.html')
html = t.render(Context({'name':name}))
return HttpResponse(html)
<p>
{{ name }}
<form method="POST" action="/save/">
{% csrf_token %}
<textarea name="content" rows="20" cols="60">{{content}}</textarea><br>
<input type="submit" value="Save Page"/>
</form>
<div> Cant figure out any solution! :( </div>
</p>
url(r'^home/$', 'contacts.views.home_Page'),
url(r'^save/$', 'contacts.views.search_Post'),
url(r'^edit/$', 'contacts.views.edit_Page'),
url(r'^search/$', 'contacts.views.search_Page'),
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.csrf',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.core.context_processors.request',
'django.contrib.messages.context_processors.messages'
)
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',
)
答案 0 :(得分:7)
我遇到了同样的问题,并通过在您的视图中添加ensure_csrf_cookie decorator来解决问题:
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
#...
它会在浏览器cookie中设置csrftoken,你可以像这样设置ajax
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;
}
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", getCookie('csrftoken'));
}
}
});
$.ajax({
url: url,
type: type,
async: async,
data: data,
error: function (e) {},
success: function (data) {
returnFunction(data);
}
});
答案 1 :(得分:4)
您可以使用两种方法将CSRF令牌传递给模板处理器
c = {}
c.update(csrf(request))
和 RequestContext,只需一个see docs。但你使用错误的地方,服务'POST'请求。这些请求通常由浏览器在填写表单并希望获得结果时发送。
您的浏览器呈现home.html向服务器发送GET请求,该服务由
提供t = get_template('home.html')
html = t.render(ResponseContext({'name':name}))
return HttpResponse(html)
您的部分代码。在那里你不使用任何手段来传递csrf令牌。因此,当调用模板处理器get_template().render()
时,其上下文中没有令牌,因此只需忽略模板中的{%csrf_token%}代码。所以你必须在t.render(...)部分视图中使用RequestContext
,或者在那里传递c
dict。
您可以检查它在浏览器窗口中检查生成的表单。
<强>更新强>
在seetings.py
'django.core.context_processors.csrf'
之后添加一个逗号,就像它现在的方式一样,它只是连接字符串。
应该是:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.csrf',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
答案 2 :(得分:1)
似乎您忘记传递渲染请求
Django附带了一个特殊的Context类django.template.RequestContext,其作用与普通的django.template.Context略有不同。第一个区别是它需要一个HttpRequest作为它的第一个参数。例如:
除此之外,RequestContext始终使用django.core.context_processors.csrf。这是管理员和其他contrib应用程序所需的安全相关上下文处理器,并且在意外错误配置的情况下,它是故意硬编码的,并且不能通过TEMPLATE_CONTEXT_PROCESSORS设置关闭。
所以你需要的是
t = get_template('home.html')
c = RequestContext(request, {'name':name})
return HttpResponse(t.render(c))
如果你喜欢,你可以在这里查看django码头 https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext
答案 3 :(得分:1)
从修复HTML开始(您忘了 = ):
<form method="POST" action="/search/save">
{% csrf_token %}
<textarea name="content" rows="20" cols="60">{{content}}</textarea><br>
<input type="submit" value="Save Page"/>
</form>
此外:
def home_Page(request):
#if request.method == 'GET':
name='Awais you have visited my website :P'
if request.method == 'POST':
#name = request.POST.get('content')
return render_to_response("search.html", {}, context_instance=RequestContext(request))
return render_to_response("home.html", {'name':name}, context_instance=RequestContext(request))
答案 4 :(得分:-4)
尝试使用确切的IP地址和端口号而不是DNS ...而不是 localhost 使用 127.0.0.1 以及端口号。