You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo自定义模块中跨域AJAX访问问题求助

解决Odoo自定义模块控制器跨域失效问题

看起来你遇到的问题很典型——同一份逻辑的控制器,官方模块里能正常跨域,自定义模块里却不行,明明浏览器能直接访问路由。我来帮你梳理几个排查和解决的方向:

1. 先确认自定义控制器的路由配置细节

首先再核对一遍你的自定义控制器代码,确保@http.route装饰器里的cors='*'参数没有遗漏或写错,建议显式指定请求方法避免预检请求问题:

from odoo import http

class MyWebService(http.Controller):
    # 确保cors参数明确设置,同时显式包含OPTIONS方法
    @http.route('/ws6/mytest', type='json', auth='public', cors='*', methods=['GET', 'POST', 'OPTIONS'])
    def my_test_endpoint(self):
        return {"message": "Hello from custom module"}

2. 确保自定义模块已正确更新

很多时候我们修改了代码,但忘记在Odoo后台更新模块,导致新的cors配置根本没生效。你可以:

  • 进入Odoo后台的「应用」列表,找到你的mymodule,点击「更新」按钮
  • 或者用命令行执行更新:odoo-bin -u mymodule -d your_database_name

3. 检查响应头,定位问题根源

打开浏览器开发者工具(F12),切换到「Network」标签,发起跨域请求后查看该请求的Response Headers:

  • 如果找不到Access-Control-Allow-Origin: *这个头,说明Odoo没有正确输出CORS配置,回到第一步检查代码和模块更新状态
  • 如果这个头存在但跨域还是失败,试试清除浏览器缓存后再测试,避免旧响应缓存干扰

4. 排查反向代理(如Nginx)的干扰

如果你用了Nginx之类的反向代理,可能代理配置覆盖了Odoo返回的CORS头。比如Nginx里如果只给/ws5/*路径设置了CORS头,却没包含/ws6/*:

# 错误示例:只针对ws5设置了头
location /ws5/ {
    add_header Access-Control-Allow-Origin *;
    proxy_pass http://odoo-server:8069;
}

location /ws6/ {
    proxy_pass http://odoo-server:8069;
    # 缺少CORS头配置
}

这种情况下,即使Odoo返回了CORS头,也会被Nginx忽略。你需要修改Nginx配置,确保所有需要跨域的路由都能正确传递CORS头,或者直接让Nginx不干预,完全由Odoo处理(删除Nginx里的add_header Access-Control-Allow-Origin配置)。

5. 清除Odoo服务器缓存

有时候Odoo的服务器缓存会导致代码变更不生效,你可以:

  • 重启Odoo服务
  • 在Odoo后台开启开发者模式,点击右上角的「清除缓存并重新加载」按钮

按照这些步骤排查下来,基本能解决自定义模块控制器的跨域问题。

内容的提问来源于stack exchange,提问作者Sami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:17:58