【问题标题】:Odoo 12 - Invalid CSRF Token with AJAX for adding to wishlistOdoo 12 - 带有 AJAX 的无效 CSRF 令牌添加到愿望清单
【发布时间】:2026-02-08 01:10:02
【问题描述】:

我目前在一家公司担任开发人员,该公司的网站基于 Odoo 12。 一切都很好,即使这个系统......对于你的第一次实习来说工作起来很复杂。

首先我会解释为什么我想要这个,我的限制是什么,我在这一点上做了什么。

  1. 我目前正在开发一个配置器(用于计算机),它可以工作!现在是时候添加到购物车,如果有库存(有效),如果没有,则添加到愿望清单问题出在此)。
  2. 由于限制,我无权访问 python 端,也无权访问代码。只有模型中的 XML(HTML 和 CSS)(但我可以创建它们)。因此,我正在使用服务器端 XML/HTML 和 JS 完成所有工作。它再次起作用了。
  3. 这就是为什么我要展示的代码是 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


    【解决方案1】:

    大家下午好,

    对于这个问题,我没有找到声明这个 CSRF Token的方法,但是有一个解决方法。

    我们可以使用 form 版本来添加愿望单。为什么,因为添加到愿望清单时没有重定向(而不是添加到购物车)。

    就我而言,我没有任何代码可显示给您,因为我们选择不使用愿望清单。如果您想要一个示例,您可以在您自己的网站上的任何添加到愿望清单按钮上查看如何制作它。

    【讨论】:

      最近更新 更多