2013-10-25 5 views
3

AoA Я новичок в Django, я пытаюсь получить данные из POST, но получаю ошибку CSRF cookie не установлен, я очень старался найти решение для google и stackoverflow через Google тоже, но неCSRF cookie не установлен django ... проверка не удалась

здесь код

views.py

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) 

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.py

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'), 

settings.py

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', 
) 

ответ

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)) 

Если Вы пустошь, как Вы можете проверить Джанго док здесь https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext

+0

Вы могли бы интерпретировать PLZ? –

+0

да Одна секунда пожалуйста – oleg

+0

, пожалуйста, проверьте это – oleg

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%} в шаблоне. Поэтому вам нужно либо использовать RequestContext в t.render (...) части зрения, либо передать вам c dict там.

Вы можете проверить его на проверку сгенерированной формы в окне браузера.

UPDATE

В seetings.py добавить запятую после 'django.core.context_processors.csrf', как это сейчас, это просто contcatenates строки.

Должно быть:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.csrf', 
    'django.contrib.auth.context_processors.auth', 
    'django.core.context_processors.debug', 
+0

Я обновил ответ, ничего не случилось :( –

+0

Вы видите токен csrf в сгенерированном html? – alko

+0

Что это за ответ? Контекст? –

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)) 
+0

Я обновил свой вопрос, исправляя «action =» и заменяя свой код моим, он отлично работает с GET, но когда я нажимаю кнопку формы, он дает мне ошибку ... cookie не установлен ...Ошибка CSRF –

+0

Проверьте отображаемую страницу. У вас есть поле csrf (скрытый ввод)? –

+0

нет поля csrf в html странице –

7

У меня была такая же проблема, и разрешили его, добавив ensure_csrf_cookie decorator к вашему мнению:

from django.views.decorators.csrf import ensure_csrf_cookie 
@ensure_csrf_cookie 
def yourView(request): 
    #... 

Он установит csrftoken в браузере куки, и вы можете сделать Аякса как этот

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); 
      } 
    }); 
+0

wow! Это сработало для меня, поэтому это сохраняет защиту csrf на вашем сайте, это правильно? –

-4

Попробуйте использовать точный IP-адрес с номером порта вместо DNS ... Как вместо локального хоста127.0.0.1 вместе с номером порта.

+0

Это не имеет никакого отношения к вопросу. В дополнение к этому вы неправильно использовали термин DNS. Не имеет смысла использовать IP-адрес вместо имени хоста. –

Смежные вопросы