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
相关产品推荐
相关产品推荐

