Django修改密码页CSRF token报错及表单action_url用法咨询
问题解答
1. CSRF 403报错原因及最佳实践
报错原因
Django的{% csrf_token %}模板标签本身就会自动渲染出一个<input type="hidden" name="csrfmiddlewaretoken" value="正确的动态token值">的隐藏表单项。你在模板里额外手动添加了一个同name、value为空的隐藏表单项,表单提交时会同时上传两个同名参数,Django校验时会读取到空的token值,导致校验不通过,触发403错误。删除手动添加的空值input后,只有模板标签生成的有效token会被提交,校验自然就通过了。
CSRF最佳实践
- 所有POST表单统一使用
{% csrf_token %}模板标签生成token字段,不要手动编写csrfmiddlewaretoken的隐藏input - 用AJAX发送POST请求时,从Cookie中读取
csrftoken值,添加到请求头的X-CSRFToken字段中即可完成校验 - 不要全局禁用CSRF中间件,特殊不需要校验的接口单独给视图添加
@csrf_exempt装饰器,且要做好其他安全校验避免被攻击 - 涉及敏感操作的POST请求必须开启CSRF校验,不要为了省事跳过校验逻辑
2. action_url变量说明及两种写法对比
action_url不是Django内置的模板变量,是开发者自定义传给模板的上下文参数,专门用于可复用的表单模板场景。
两种写法没有绝对的好坏,适用场景不同:
- 如果你的表单模板只会对应一个固定的提交地址,直接硬写
{% url 'users:password_change_form' %}即可,逻辑更直白,维护成本更低 - 如果你要做通用的表单组件,同一个表单模板要在多个业务场景下使用、对应不同的提交地址,用action_url变量的写法灵活度更高,不用针对每个场景单独写一套表单模板,复用性更强
内容的提问来源于stack exchange,提问作者Zhalgas
相关产品推荐
相关产品推荐

