如何将django csrf令牌直接嵌入HTML?

如何将django csrf令牌直接嵌入HTML?,django,csrf,django-csrf,Django,Csrf,Django Csrf,在我的django应用程序中,我将html字符串存储在数据库中,然后在用户主页上显示为“消息”。其中一些消息包含表单,但不是用模板语言编写的,我无法插入csrf令牌(因此破坏了应用程序) 有没有办法直接从我正在编辑的python文件中插入这个令牌?我正在寻找以下线索: csrf_token = django.csrf.generate() message = "press the button please: <form><input type='hidden' name='c

在我的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)
csrf\u token=django.csrf.generate()
message=“请按按钮:”%(csrf\U令牌)
任何其他在类似场景下工作的解决方案都将非常好。 谢谢

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

使用它的方法是直接在模板中使用它

从,:


{%csrf_令牌%}

是您必须包含的所有内容。

调用django.middleware.csrf.get_token(request)以获取csrf token。

接受的答案假定已在请求对象中设置了token

也许这样更好:

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

“在视图中动态加载令牌”是什么意思?表单作为字符串存储在数据库中,因此,如果我将令牌存储在那里,则在新会话中加载令牌后,它将立即无效。如果可以从视图内部加载新标记,那么我可以在呈现html时截取它,插入适当的标记,并显示工作表单。这里的关键是,我不是通过模板来插入令牌。这让它更清楚了吗?你不能用csrf_保护装饰器吗?谢谢。问题是“消息”是在视图中创建的,并存储到数据库中,而从未经过视图。我将通过将表单按钮转换为链接并通过视图绕过csrf来解决此问题。问题是在您不使用django的模板的情况下,这在django CMS的安装过程中为我解决了此问题!出于某种原因,如果我唯一的模板中没有这个令牌,它将无法登录。奇怪。这是通过将令牌放入一个隐藏的输入来实现的吗?因为我一直遇到同样的错误,那么将这个令牌放入表单的最佳方式是什么呢?好的,我的解决方案是使用名称“csrfmiddlewaretoken”而不是“csrf_令牌”,您不应该使用内部API,事实上,Django中不再存在_get_new_csrf_key()。您应该使用get_token()。
csrf.get_token
已经创建了一个新的令牌,如果它还不存在的话
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