Доступ к CSRF токену Django приложения из кода программы

    Общий рейтинг статьи: 0 (проголосовало 0 )
    Опубликовано:  [просмотров 234]


    Наверное каждому Django-разработчику знакомо сообщение о ошибке "CSRF token missing or incorrect".

    CSRF

    Именно таким образом, при включенном режиме Debug, отрабатывает подсистема противодействия подделке межсайтовых запросов. Обычно для работы с механизмами CSRF-защиты web-приложений в Django используется тег {% csrf_token %} в шаблонной системе Django.

    Этот метод простой и удобный и за вас все сделают механизмы csrf.CsrfViewMiddleware. Но в ряде случаев мы имеем дело с сильно-динамическими формами ввода данных и логику их работы в шаблон не поместишь и поэтому приходится генерировать код на стороне python-приложения, передавая его в шаблон в виде html-кода через модификатор "| safe".

    При генерации форм из кода приложения, вам естественно потребуется каким-то образом получить значение токена для страницы и поместить его на форму, для последующей обработки Middleware. Обратите внимание, что при использовании разного рода Ajax-элементов вам так же потребуется передавать токен.

    Если мы посмотрим на код сгенерированной шаблонизатором формы в которой используется тег{% csrf_token %}, то мы увидим следующий HTML код:

    <form action="/post-form/" method="post">
    <input type='hidden' name='csrfmiddlewaretoken' value='oUD8tY2LdWg4V35B...RShFf4WSaaV' />

    Из кода видно, что фактически нам требуется получить значение переменной и добавить его к нашему генератору HTML-формы. Для получения значения токена используется одноименная функция из модуля django.template.context_processors:

    from django.template.context_processors import csrf
    csrf_token = str(csrf(self.request)['csrf_token'])

    Теперь можно добавить значение переменной к коду генерации HTML:

    <input name="csrfmiddlewaretoken" value="'+csrf_token+'" type="hidden">


    Связанные записи в блоге

    Обсуждение статьи

    Ваш комментарий: