odoo17 @http.route('/gl_mes_mac/list2', auth='user', type='http', methods=['POST'], csrf=True)CSRF=True在请求的时候怎么传入csrf
时间: 2024-09-23 16:12:48 浏览: 43
在Odoo 17中,`@http.route`装饰器中的`csrf=True`表示开启跨站请求伪造(Cross-Site Request Forgery, CSRF)保护。当需要通过`/gl_mes_mac/list2`这个HTTP POST接口发送带CSRF验证的请求时,你需要在客户端(通常是在前端页面或者API客户端)生成并附带一个特殊的CSRF令牌(也叫CSRF token)。
1. **生成CSRF Token**: Odoo会在每个响应中包含一个隐式设置的CSRF token,这通常在`response.context`中可以找到。如果你使用的是Ajax请求或者前端模板,可以在获取数据的同时获取这个token。
```python
# 假设你在前端JS里,可以从AJAX返回中获取:
var csrfToken = response.csrf_token; // 假设response是一个Odoo API的返回对象
// 或者在Python视图中直接传递给前端模板
context = {'csrf_token': csrf_token}
return http.request.render('your_template_name', context=context)
```
2. **将CSRF Token附到请求头**: 将获取到的CSRF token添加到HTTP请求头(如`X-CSRF-Token`,`Referer`等)或者请求体(例如JSON payload)中。对于Postman、curl命令或其他API工具,可能是这样的:
```json
{
"method": "POST",
"url": "/gl_mes_mac/list2",
"headers": {
"Content-Type": "application/json",
"X-CSRF-Token": csrfToken,
"Authorization": "Bearer your_auth_token" // 如果有其他认证机制
},
"body": {
... // 请求体内容
}
}
```
3. **验证CSRF Token**: 当服务器接收到请求时,它会检查是否有正确的CSRF token。如果令牌无效,服务器会拒绝请求并返回错误信息。