【发布时间】:2026-02-08 01:10:02
【问题描述】:
我目前在一家公司担任开发人员,该公司的网站基于 Odoo 12。 一切都很好,即使这个系统......对于你的第一次实习来说工作起来很复杂。
首先我会解释为什么我想要这个,我的限制是什么,我在这一点上做了什么。
- 我目前正在开发一个配置器(用于计算机),它可以工作!现在是时候添加到购物车,如果有库存(有效),如果没有,则添加到愿望清单(问题出在此)。
- 由于限制,我无权访问 python 端,也无权访问代码。只有模型中的 XML(HTML 和 CSS)(但我可以创建它们)。因此,我正在使用服务器端 XML/HTML 和 JS 完成所有工作。它再次起作用了。
- 这就是为什么我要展示的代码是 JS(使用 AJAX):
// Add to cart
function cookieConfigAddToCart() {
// [ID][isInStock]
// 12671 is 'montage'
let cookieSelectedIds = [['12671', true]];
// for each selected products, push his ID in the 'cookieSelectedIds'
for (let i = cookieSelectedProducts.length - 1; i >= 0; i--) {
if (cookieSelectedProducts[i].hasAttribute('p-id')) {
cookieSelectedIds.push([
cookieSelectedProducts[i].getAttribute('p-id'),
cookieSelectedProducts[i].getAttribute('p-isinstock') === 'true'
]);
}
}
console.log(cookieSelectedIds);
// For each selected products, send a query
// to the server to update the cart
if (cookieSelectedIds.length > 1) {
for (let i = cookieSelectedIds.length - 1; i >= 0; i--) {
let errorAddToCart = false;
if (cookieSelectedIds[i][1]) {
$.ajax({
async: false,
type: 'POST',
url: '/shop/cart/update',
data: {
csrf_token: document.getElementById('cookieConfigAddToCartToken').innerHTML,
product_id: cookieSelectedIds[i][0]
},
success: function() {
console.log(i+": OK (CART)");
},
error: function() {
for (let y = cookieSelectedProducts.length - 1; y > 0; y--) {
if (cookieSelectedProducts[y].getAttribute('p-id') == cookieSelectedIds[i][0]) {
console.error(
"Il y a eu une erreur pendant l'envoi au serveur du produit: "
+ cookieSelectedProducts[y].innerHTML
);
console.log("Veuillez réessayer ultérieurement");
break;
}
}
},
});
}
else {
$.ajax({
async: false,
type: 'POST',
url: '/shop/wishlist/add',
data: {
id: document.getElementById('cookieConfigAddToCartToken').innerHTML,
jsonrpc: "2.0",
method: "call",
params: '{product_id: '+cookieSelectedIds[i][1]+'}'
},
success: function() {
console.log(i+": OK (WISHLIST)");
},
error: function() {
for (let y = cookieSelectedProducts.length - 1; y > 0; y--) {
if (cookieSelectedProducts[y].getAttribute('p-id') == cookieSelectedIds[i][0]) {
console.error(
"Il y a eu une erreur pendant l'envoi au serveur du produit: "
+ cookieSelectedProducts[y].innerHTML
);
console.log("Veuillez réessayer ultérieurement");
break;
}
}
},
});
}
}
// window.location.href = "/shop/cart/";
}
}
所以“购物车”部分运行良好 (url: '/shop/cart/update',),但“愿望清单”部分 (url: '/shop/wishlist/add') 运行良好。
我迷失在愿望清单的 CSRF 令牌上。 官方方式使用9位数字,但我不知道如何找到/获取它。
使用 旧 9 位数字或我目前正在使用的数字,我有(毫不奇怪)这些消息:
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_http.py", line 234, in _dispatch
result = request.dispatch()
File "/home/odoo/src/odoo/odoo/http.py", line 807, in dispatch
raise werkzeug.exceptions.BadRequest('Session expired (invalid CSRF token)')
werkzeug.exceptions.BadRequest: 400 Bad Request: Session expired (invalid CSRF token)
那么我的问题是(因为我没有访问权限,也不想禁用 CSRF 令牌)。如何用 AJAX 声明一个?
感谢您的阅读,希望我们能一起找到解决办法。
P.S.:我看到了这个 (https://*.com/a/41486127/13147732),但我不确定安全性。也许这个可以帮助(https://*.com/a/53151896/13147732)。
【问题讨论】:
标签: ajax odoo-12 csrf-token