2010-07-20 7 views
24

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

Есть ли способ вставить этот токен непосредственно из файлов 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) 

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

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

+0

Что вы имеете в виду под "динамически загрузить маркер в поле зрения? –

+0

форма сохраняется в виде строки в базе данных, поэтому, если я храню токен там, он будет недействительным, как только он будет загружен в новый сеанс. Если бы можно было загрузить новый токен изнутри представления, я мог бы перехватить html по мере его рендеринга, вставить соответствующий токен и отобразить рабочую форму. Главное здесь, что я не прохожу через шаблон, чтобы вставить токен. Это делает его более ясным? – ergelo

+0

Не можете ли вы просто использовать декоратор csrf_protect? – sureshvv

ответ

42

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

+1

, который решил бы это. спасибо, что указали! – ergelo

+0

Это работает, помещая токен в скрытый ввод? Поскольку я продолжаю получать ту же ошибку, что было бы лучшим способом поместить этот токен в форму? –

+0

Хорошо для меня было использовать имя «csrfmiddlewaretoken» вместо «csrf_token» –

17

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

От the documentation,:

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

все, что вам нужно включить.

+0

спасибо. проблема в том, что «сообщение» создается в представлении и сохраняется в db, не просматривая представление. Я решу проблему, поворачивая кнопку формы в ссылку и просматривая представление, чтобы обойти csrf. – ergelo

+8

вопрос для случая, когда вы не используете шаблоны django –

+0

Это решило его для меня во время установки Django-CMS! По какой-то причине он не будет входить без этого токена в единственный шаблон, который у меня был. Weird. – MadPhysicist

10

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

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

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 
+0

спасибо. это работает для меня. – wildcolor

+0

вам не следует использовать внутренние API-интерфейсы, и на самом деле _get_new_csrf_key() больше не существует в Django. вы должны использовать get_token(). – interDist