web-dev-qa-db-ja.com

Django csrfトークンをHTMLに直接埋め込むにはどうすればよいですか?

内でDjango app私はユーザーのホームページに「メッセージ」として表示されるhtmlの文字列をdbに保存しています。これらのメッセージの一部にはフォームが含まれていますが、テンプレート言語では、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)

同様のシナリオで機能する他のソリューションがあればすばらしいでしょう。ありがとう

編集:トークンはセッションごとに異なるため、実際には機能しません。そのため、dbにトークンを保存することはあまり役に立ちません。ビュー内でトークンを動的にロードする方法はありますか?

30
ergelo

CSRFトークンを取得するには、Django.middleware.csrf.get_token(request)を呼び出します。

50
Török Gábor

それを使用する方法は、isテンプレートで直接使用することです。

ドキュメント から:

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

あなたが含まなければならないすべてです。

25
Lakshman Prasad

受け入れられた回答は、トークンが要求オブジェクトにすでに設定されていることを前提としています。

多分このようなものが良いです:

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
9
Evgeny