python - csrfmiddlewaretoken - ¿Cómo uso ensure_csrf_cookie?
django csrf_exempt decorator (4)
Aunque haya encontrado lo que estaba buscando, estos conceptos lo ayudarán.
Las vistas son funciones que se llaman cuando se solicita una URL. Y hay dos tipos de vistas:
- Vistas basadas en funciones
- Vistas basadas en clase.
El funcionamiento básico de la vista es procesar un HttpRequest y enviar un HttpResponse. Y cada vista que devuelve un HttpResponse debe tener un parámetro de solicitud.
Ex de una vista basada en función:
def myView(request):
...
# process the request here
return HttpResponse() # or render_to_response depending upon what you want.
No veo un parámetro de request
en su vista.
Ahora un decorador es algo que pone ciertas condiciones en una vista.
Por ejemplo: si tiene la función de vista para comentar y desea que el usuario inicie sesión para comentar, puede usar un decorador de login_required
en la vista.
Esto asegurará que cualquier persona que quiera hacer un comentario primero necesite iniciar sesión. La sintaxis básica es:
@login_required # this is the decorator
def comment(request): # this is the view on which the decorator is acting upon
...
...
return HttpResponse()
Similar al @login_required, @ensure_csrf_cookie es un decorador.
Soy nuevo en Python. También nuevo en Django. Estoy tratando de hacer una solicitud de AJAX y seguí las instrucciones aquí . al principio, el resultado de recuperar la cookie csrf siempre fue nulo, así que encontré un método de decorador llamado ensure_csrf_cookie. El problema es que pide una vista, y no tengo idea de qué ver para pasar y dónde puedo obtener una referencia. El código es bastante simple:
from django.shortcuts import render_to_response
from django.core.context_processors import csrf
from django.views.decorators.csrf import ensure_csrf_cookie
def csv_to_xform(csv, template):
return render_to_response(template, { "data": "it works!" })
¿Debo usar una vista basada en clase? si es así, ¿hay una mejor manera de configurar la cookie? Me gustaría no utilizar el método descrito aquí , porque no quiero tener que manejar manualmente el valor.
El resto del código es el siguiente:
sandbox.html:
<!doctype html>
<html>
<head>
<title>Sandbox</title>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="/static/js/csrf.js"></script>
<script type="text/javascript">
$(function () {
$(''#send-csv-btn'').click(function () {
$.post(''/csv'', {
data: ''1, 2, 3'',
success: function (response) {
console.debug(response);
},
error: function (response) {
console.debug(response);
}
});
});
});
</script>
</head>
<body>
<form>
{% csrf_token %}
<input type="button" id="send-csv-btn" />
</form>
</body>
</html>
urls.py:
urlpatterns = patterns('''',
url(r''^$'', ''dkobo.formbuilder.views.main'', name=''fb''),
url(r''^admin/'', include(admin.site.urls)),
url(r''^csv$'', ''dkobo.formbuilder.views.csv_to_xform'', { "template": "sandbox-stub.html" }),
url(r''^sandbox$'', ''dkobo.formbuilder.views.sandbox'')
)
settings.py:
MIDDLEWARE_CLASSES = (
''django.contrib.sessions.middleware.SessionMiddleware'',
''django.middleware.common.CommonMiddleware'',
''django.middleware.csrf.CsrfViewMiddleware'',
''django.contrib.auth.middleware.AuthenticationMiddleware'',
''django.contrib.messages.middleware.MessageMiddleware'',
''django.middleware.clickjacking.XFrameOptionsMiddleware'',
)
Las cookies se configuran en la respuesta del servidor, por lo que debe configurar @ensure_csrf_cookie decorator para ver, que renderiza la página, desde la cual el usuario hará una solicitud ajax.
Por ejemplo, si el navegador de los usuarios hace una solicitud jajax en la página principal de los sitios, configure este decorador para ver, responsable de la página principal.
ACTUALIZACIÓN: ajax solicita llamadas desde la página sandbox? luego intente establecer ensure_csrf_cookie para la vista de espacio aislado, como esta:
@ensure_csrf_cookie
def sandbox(request):
...
Los tokens CSRF se validan automáticamente cuando tienes:
MIDDLEWARE_CLASSES = (
...
''django.middleware.csrf.CsrfViewMiddleware'',
...
)
en su proyecto de settings.py
archivo settings.py
Cuando tiene dicho middleware, solo necesita poner la variable crsf_token en todos sus formularios (en plantillas), y se valida automáticamente, por ejemplo:
<form>
{% csrf_token %}
...
No sé si entendí tu problema en absoluto;)
Para aquellos que buscan una forma de hacer esto con vista basada en clases:
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie
class MyView(View):
@method_decorator(ensure_csrf_cookie)
def get(self, request, *args, **kwargs):
...