Как я могу встраивать токен django csrf прямо в HTML? - PullRequest
28 голосов
/ 20 июля 2010

в моем приложении django я храню строки html в БД, которые затем будут отображаться на домашних страницах пользователей как «сообщения».Некоторые из этих сообщений содержат формы, но не написаны на языке шаблонов, я не могу вставить токен csrf (таким образом, ломая приложение).

Есть ли способ вставить этот токен непосредственно из файлов python, которые я редактирую?я ищу что-то вроде:

csrf_token = django.csrf.generate()
message = "press the button please: <form><input type='hidden' name='csrf_token' value='%s'><input type='submit' value='press here'></form>" % (csrf_token)

любое другое решение, которое будет работать в подобном сценарии, было бы замечательно.Спасибо

Редактировать: На самом деле это не сработает, потому что токен отличается для каждого сеанса, поэтому его сохранение в БД не очень полезно.Есть ли способ динамической загрузки токена в представлении?

Ответы [ 3 ]

50 голосов
/ 21 июля 2010

Позвоните django.middleware.csrf.get_token(request), чтобы получить токен CSRF.

25 голосов
/ 20 июля 2010

Способ использования, - это , чтобы использовать его непосредственно в шаблонах.

С документация ,:

<form action="" method="post">
{% csrf_token %}

это все, что вы должны включить.

9 голосов
/ 13 сентября 2013

В принятом ответе предполагается, что токен уже установлен в объекте запроса.

Может быть, что-то вроде этого лучше:

from django.middleware import csrf
def get_or_create_csrf_token(request):
    token = request.META.get('CSRF_COOKIE', None)
    if token is None:
        token = csrf._get_new_csrf_key()
        request.META['CSRF_COOKIE'] = token
    request.META['CSRF_COOKIE_USED'] = True
    return token
...