如何将 django csrf 令牌直接嵌入 HTML?
Posted
技术标签:
【中文标题】如何将 django csrf 令牌直接嵌入 HTML?【英文标题】:How can I embed django csrf token straight into HTML? 【发布时间】:2011-03-18 10:04:54 【问题描述】:在我的 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)
在类似情况下工作的任何其他解决方案都会很棒。 谢谢
编辑: 实际上这是行不通的,因为每个会话的令牌都不同,因此将其存储在数据库中并不是很有用。有没有办法在视图中动态加载令牌?
【问题讨论】:
“在视图中动态加载令牌”是什么意思? 表单作为字符串存储在数据库中,所以如果我将令牌存储在那里,一旦在新会话中加载它就会无效。如果可以从视图内部加载新令牌,那么我可以在呈现 html 时截取它,插入适当的令牌并显示工作表单。这里的关键是我没有通过模板来插入令牌。是不是更清楚了? 你不能只使用 csrf_protect 装饰器吗? 【参考方案1】:使用方式,是直接在模板中使用。
来自the documentation,:
<form action="" method="post">
% csrf_token %
是您必须包含的所有内容。
【讨论】:
谢谢。问题是“消息”是在视图中创建的,并存储到数据库中而无需通过视图。我将通过将表单按钮转换为链接并通过视图绕过 csrf 来解决问题。 问题是你不使用 django 模板的情况 这在安装 Django-CMS 期间为我解决了这个问题!出于某种原因,在我拥有的唯一模板中,如果没有这个令牌,它就不会登录。很奇怪。【参考方案2】:拨打django.middleware.csrf.get_token(request)
获取CSRF令牌。
【讨论】:
是否可以通过将令牌放入隐藏输入中来实现?因为我不断收到相同的错误,所以将此令牌放入表单的最佳方法是什么? 对我来说好的解决方案是使用名称“csrfmiddlewaretoken”而不是“csrf_token”【参考方案3】:接受的答案假定令牌已在请求对象中设置。
也许这样更好:
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
【讨论】:
你不应该使用内部 API,事实上 _get_new_csrf_key() 在 Django 中已经不存在了。你应该使用 get_token()。csrf.get_token
已经创建了一个新令牌(如果它还不存在)以上是关于如何将 django csrf 令牌直接嵌入 HTML?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 POST 数据中的 CSRF 令牌传递给 Django?
如何将 Django 的 CSRF 令牌添加到 jQuery POST 请求的标头?
如何从 Django 在前端获取 CSRF 令牌以及如何在 Postman 中使用它