La cookie CSRF no establece la verificación django … falló

AoA Soy nuevo en Django, estoy tratando de obtener datos de POST, pero al obtener el error no se configuró la cookie CSRF, intenté encontrar la solución en google y stackoverflow a través de google también, pero fracasé

aquí está el código

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

Archivo HTML

 

{{ name }} {% csrf_token %}

Cant figure out any solution! :(

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

    Tuve el mismo problema y lo resolví agregando el decorador asegurar_csrf_cookie a su vista:

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

    Establecerá csrftoken en la cookie del navegador y usted puede hacer un ajax como este

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

    Utiliza ambos medios para pasar el token CSRF al procesador de plantillas

     c = {} c.update(csrf(request)) 

    y RequestContext, mientras que uno es suficiente, ver documentos . Pero lo usas en el lugar equivocado, para servir la solicitud ‘POST’. Estas solicitudes normalmente las envía su navegador cuando llena un formulario y desea obtener resultados.

    Su navegador procesa home.html enviando una solicitud GET a un servidor, que es atendido por

     t = get_template('home.html') html = t.render(ResponseContext({'name':name})) return HttpResponse(html) 

    parte de su código. Y allí no usas ningún medio para pasar el token csrf. Por lo tanto, cuando se get_template().render() procesador de plantilla get_template().render() , no tiene token en su contexto, simplemente ignora el código {% csrf_token%} en la plantilla. Por lo tanto, debe usar RequestContext en la parte de vista de t.render (…), o pasarle allí.

    Puedes comprobarlo inspeccionando el formulario generado en una ventana del navegador.

    ACTUALIZAR

    En seetings.py agregue una coma después de 'django.core.context_processors.csrf' , tal como está ahora, solo contacta las cadenas.

    Debiera ser:

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

    Comience de arreglar su HTML (Olvidó = ):

     
    {% csrf_token %}

    También:

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

    Parece que has olvidado pasar la solicitud de renderizar.

    Django viene con una clase de contexto especial, django.template.RequestContext, que actúa de manera ligeramente diferente a la normal django.template.Context. La primera diferencia es que toma un HttpRequest como su primer argumento. Por ejemplo:

    Además de estos, RequestContext siempre usa django.core.context_processors.csrf. Este es un procesador de contexto relacionado con la seguridad requerido por el administrador y otras aplicaciones de contribución y, en caso de una mala configuración accidental, está deliberadamente codificado y no puede ser desactivado por la configuración TEMPLATE_CONTEXT_PROCESSORS.

    Así que lo que necesitas está siguiendo

     t = get_template('home.html') c = RequestContext(request, {'name':name}) return HttpResponse(t.render(c)) 

    Si te gustaría, puedes consultar el django dock aquí https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext

    Intente usar la dirección IP exacta con el número de puerto en lugar del DNS … Me gusta en lugar de localhost use 127.0.0.1 junto con el número de puerto.