【问题标题】:CSRF verification , In django TemplatesCSRF 验证,在 django 模板中
【发布时间】:2012-03-29 20:30:17
【问题描述】:

我试图在我的自定义模板标签中创建一个表单,然后尝试在那里创建一个 HTML 表单,然后在我的模板中简单地使用它,但是当用户提交时我收到 CSRF 验证失败错误表单(这很自然,因为我没有在模板标签内提供带有 csrf_token 的表单),我这样做了:

@register.simple_tag(takes_context=True)
def change_password_(context):
    csrf = context.get('csrf_token', '')
    html = "<form action='{% url change_password %}' method='post' id='renew_password' >"
    csrf_string = str(csrf)
    html += "<input type='hidden' value='%' />" %csrf_string
....

但我仍然收到 CSRF 验证失败错误 :( 知道如何使它工作吗?
谢谢

【问题讨论】:

    标签: python django templates csrf


    【解决方案1】:

    您需要在表单标记后添加{% csrf_token %},而不是隐藏输入。

    阅读this article了解更多信息。

    【讨论】:

    • 我是从 TemplateTag 做的,它不是模板(它是 python 代码)
    【解决方案2】:

    查看我使用 tempates 制作的表格,我有这个 sn-p:

    <form action="" method="post">
    <div style='display:none'><input type='hidden'  name='csrfmiddlewaretoken'
    value='e987effa0c6ee111225a3c0edc927b06' /></div><table>
    

    也许这会让你知道如何将它直接放在你的标记中

    【讨论】:

    • hmm,当你有一个静态的令牌值时,这怎么可能有用?
    • 当然,我的token对OP没用。我只是以我的 sn-p 为例,因为 OP 似乎知道如何获取他自己的令牌。
    【解决方案3】:

    首先,尝试在模板标签中打印csrf,或者检查渲染的html,确保模板标签成功从模板上下文中获取csrf_token

    其次,您的 csrf 标签没有 name 属性。请尝试以下操作:

    html += "<input type='hidden' name='csrfmiddlewaretoken' value='%' />" %csrf_string
    

    最后,我会考虑将您的模板标签写为inclusion tag。这会将 html 移动到一个单独的模板,看起来更整洁。然后您可以在标签的模板文件中使用{% csrf_token %}

    【讨论】:

    • 似乎问题在于“名称”属性,当我添加它时它起作用了:) 谢谢
    猜你喜欢
    • 2016-03-03
    • 2011-09-28
    • 2017-10-21
    • 2015-03-18
    • 2012-09-08
    • 2015-06-02
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多