Значок Django csrf + Angularjs

У меня есть django, работающий на сервере apache с помощью mod_wsgi, а также приложение angularjs, которое выполняется непосредственно apache, а не django. Я хотел бы сделать POST-вызовы на сервер django (работает rest_framework), но у меня возникают проблемы с токеном csrf.

Есть ли способ установить маркер с сервера, не помещая {% csrf token %} качестве части шаблона (поскольку эти страницы не проходят через django)?

  • Ошибка при сохранении изображения с помощью Django Rest Framework с угловыми
  • Чрезвычайно длительное время ожидания при загрузке ресурса REST из angularjs
  • Можно ли использовать Angular с движком шаблонов Jinja2?
  • Force Selenium ждет AngularJS
  • json.loads не работает с двоичным JSON, отправленным AngularJS в Python
  • Задача кросс-домена Flask RESTful с методами Angular: PUT, OPTIONS
    1. Я хотел бы иметь возможность получить токен csrf через запрос GET в качестве файла cookie.
    2. Я хотел бы иметь возможность затем отправлять POST-запросы на сервер django с использованием значения cookie-файла маркера csrf.

  • Ошибка Django / Python. «ImportError: импорт по имени файла не поддерживается».
  • Почему использование локаторов потоков в Django плохо?
  • Django Admin: не видят приложения (проблема разрешения?)
  • В администраторе Django, как я могу скрыть кнопки «Сохранить и продолжить» и «Сохранить и добавить еще» в администраторе модели?
  • Ошибка при установке с помощью Pipeon «pip»: не удается получить индексный URL-адрес http: //
  • Временное отключение кэширования Django
  • 5 Solutions collect form web for “Значок Django csrf + Angularjs”

    Django и AngularJS уже имеют поддержку CSRF, ваша часть довольно проста.

    Во-первых, вам нужно включить CSRF в Django, я полагаю, что вы уже это сделали, если нет, выполните Django doc https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#ajax .

    Теперь Django установит файл cookie с именем csrftoken в первом запросе GET и ожидает, что пользовательский HTTP-заголовок X-CSRFToken для последующих запросов POST / PUT / DELETE.

    Для Angular он ожидает файл cookie с именем XSRF-TOKEN и будет обрабатывать запросы POST / PUT / DELETE с заголовком X-XSRF-TOKEN , поэтому вам нужно немного подкорректировать, чтобы обе они были друг с другом:

     $httpProvider.defaults.xsrfCookieName = 'csrftoken'; $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 

    Добавьте выше две строки где-то в вашем js-коде, модуль module.config () – хорошее место для этого.

    Вот и все.

    ПРИМЕЧАНИЕ. Это для углового 1.1.5, более старым версиям может потребоваться другой подход.

    Обновить:

    Так как угловое приложение не обслуживается django, для того, чтобы дать cookie быть установленным, угловое приложение должно сначала выполнить запрос GET для django.

     var foo = angular.module('foo', ['bar']); foo.config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.xsrfCookieName = 'csrftoken'; $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; }]); 

    И все модули и контроллеры, в которых используется $ http, отправляют запросы с помощью токена csrf.

    После поиска, что сработало для меня, я прочитал этот пост со следующим кодом:

     angular.module( '[your module name]', ... [some dependencies] ... 'ngCookies', ... [other dependencies] ... ) .run( function run( $http, $cookies ){ // For CSRF token compatibility with Django $http.defaults.headers.post['X-CSRFToken'] = $cookies.get('csrftoken'); }) 

    Это, конечно, после получения файла cookie через запрос GET с сервера django.

    Я также рассмотрел некоторые из других ответов здесь, в том числе Е. Лиуна, но не смог найти ничего в официальных документах, указав изменения параметров по умолчанию для xsrf на $ httpProvider, кроме этого запроса на растяжение, который не работал для меня на время, когда я пишу этот пост.

    Я создал приложение Django для моего приложения AngularJS, в том же проекте Django, что и приложение Django для моего (REST) ​​API, которое обслуживает только файл index.html (который является только sym.link). Таким образом, CSRF Cookie устанавливается без дополнительного запроса GET.

    Пожалуйста, ознакомьтесь с моим ответом здесь о веб-приложении Singleular Web-сайта AngularJS на субдомене. Разговор с API Jango JSON (REST) ​​в поддомене B с использованием защиты CORS и CSRF.

    Если у вас есть файлы cookie, запрещающие доступ к javascript, вам необходимо сделать следующее. В своем шаблоне перед созданием приложения django добавьте следующее:

     <script> window.csrf_token = "{{ csrf_token }}"; </script> 

    В своем угловом приложении добавьте следующее:

     angularApp.config(["$httpProvider", function($httpProvider) { $httpProvider.defaults.headers.common["X-CSRFToken"] = window.csrf_token; }]); 

    По крайней мере, через Django 1.9, токен CSRF не изменяется с каждым запросом. Он изменяется только при входе пользователя в систему. Если вы выполняете одностороннее угловое приложение, вам нужно убедиться, что вы сбросили токен при входе / выходе из системы, и это должно работать нормально.

    ПРИМЕЧАНИЕ. Это не работает в Django 1.10 или новее из-за изменения токена CSRF для каждого запроса. См. « Значок Pass Jango CSRF для углового с CSRF_COOKIE_HTTPONLY

    Python - лучший язык программирования в мире.