38

在我的 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)

在类似情况下工作的任何其他解决方案都会很棒。谢谢

编辑: 实际上这行不通,因为每个会话的令牌都不同,因此将其存储在数据库中并不是很有用。有没有办法在视图中动态加载令牌?

4

3 回答 3

53

调用django.middleware.csrf.get_token(request)以获取 CSRF 令牌。

于 2010-07-21T12:49:50.790 回答
42

使用方法直接在模板中使用。

文档中,:

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

就是您必须包括的所有内容。

于 2010-07-20T15:22:04.703 回答
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
于 2013-09-13T08:44:58.313 回答