Django csrf token + Angularjs

Cuando intentas consumir una API construida en Django desde el cliente Angular, y tienes el error cross-origin. Debes activar CORS en Django, y configurar Angular para que lo consuma y mande por defecto en todas las llamadas.

(Más info directamente en la documentación oficial de Django: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#ajax )

Por tanto, vayamos por partes:

Primero, en Django:

Necesitamos instalar django-cors-headers (Y como siempre, agregarlo en nuestro requirements.txt).

Tenéis toda la info del paquete en: https://github.com/ottoyiu/django-cors-headers

pip install django-cors-headers

Además, debemos indicar a Django que hemos instalado django-cors-headers. Para ello, en nuestro settings.py debemos agregar varias cosas:

En el apartado INSTALLED_APPS:

INSTALLED_APPS = (
...
'corsheaders',
...
)

En el apartado MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)

Configurando django-cors-headers

Ahora, debes agregar los hosts a los que quieres permitir realizar peticiones a la API en CORSORIGINWHITELIST. También puedes poner CORSORIGINALLOW_ALL a True para permitir el acceso desde cualquier host (No recomendable).

CORS_ORIGIN_ALLOW_ALL: Si está a True, ignorará la whitelist y permitirá peticiones desde cualquier host.
CORS_ORIGIN_WHITELIST = (
'frontend.algargar.com',
'otrositio.example.com'
)

Con esto, tenemos el lado backend solucionado. Pasamos ahora al lado AngularJS.

Segundo, en Angular:

En nuestro archivo app.js tenemos que añadir las siguientes dos lineas con httpProvider, hay que acordarse de pasar el httpProvider como argumento de la función.

.config(function ($routeProvider,$httpProvider) {
      $httpProvider.defaults.xsrfCookieName = 'csrftoken';
      $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
  });

Con esto, pasamos siempre en las cabeceras de nuestras llamadas el CRSFTOKEN, ahora ya debería estar solucionado el problema y podremos hacer peticiones al backend.

La solución del lado AngularJS, salió de:http://stackoverflow.com/questions/18156452/django-csrf-token-angularjs

Eso es todo, espero que os sea útil. Si tenéis cualquier duda, o sugerencia para mejorar esta info, podéis encontrarme en twitter o enviarme un email :-)

Saludos!
Alberto.

(Post extraído de: http://blog.algargar.com/2015/09/04/django-csrf-token-angularjs/ )