如何在Odoo 8服务器中启用CORS以实现Ajax请求?
嘿,我之前刚解决过Odoo 8里的这个CORS跨域问题,给你几个亲测有效的靠谱方案:
方案一:给Odoo添加自定义CORS中间件(推荐,不修改核心源码)
Odoo 8基于Werkzeug框架运行,我们可以通过自定义中间件的方式,给所有响应注入CORS头,同时处理OPTIONS预检请求。
- 新建一个简单的Odoo模块(或者用你现有的自定义模块),在模块的
__init__.py里添加以下代码:
from openerp.http import Root from werkzeug.wrappers import Response # 保存原始的get_response方法 original_get_response = Root.get_response def cors_enhanced_get_response(self, httprequest, *args, **kw): # 先调用原始方法获取响应 response = original_get_response(self, httprequest, *args, **kw) # 设置CORS头,生产环境建议替换*为你的前端域名(比如https://your-frontend.com) response.headers['Access-Control-Allow-Origin'] = '*' response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS, PUT, DELETE' response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization' # 处理OPTIONS预检请求,直接返回200状态 if httprequest.method == 'OPTIONS': return Response(status=200, headers=response.headers) return response # 替换原始的get_response方法 Root.get_response = cors_enhanced_get_response
- 把这个模块放到Odoo的addons目录下,在
odoo.conf里配置好addons_path,然后重启Odoo,安装这个模块即可。
方案二:用Nginx反向代理处理CORS(生产环境首选)
如果你的Odoo是通过Nginx做前端代理的,直接在Nginx配置里添加CORS规则更简单,也更易维护:
在你的Odoo站点Nginx配置的server块里,添加以下内容:
location / { # 保留你原有的Odoo代理配置 proxy_pass http://localhost:8069; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 配置CORS头 add_header Access-Control-Allow-Origin https://your-frontend-domain.com; # 替换为你的前端域名 add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, PUT, DELETE'; add_header Access-Control-Allow-Headers 'Content-Type, Authorization'; # 处理OPTIONS预检请求,直接返回204(无内容) if ($request_method = OPTIONS) { return 204; } }
修改完后重启Nginx即可生效。注意:生产环境绝对不要用*作为允许的Origin,一定要指定具体的前端域名,避免安全风险。
方案三:修改Odoo核心源码(不推荐,升级会丢失)
如果你只是临时测试,不想搞模块或Nginx,可以直接修改Odoo的核心wsgi文件,但这个方法不推荐,因为升级Odoo时修改会被覆盖:
找到Odoo安装目录下的openerp/service/wsgi_server.py,找到处理响应的部分,添加CORS头。比如在返回响应前加入:
response.headers['Access-Control-Allow-Origin'] = '*' response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS, PUT, DELETE' response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
额外注意点
- 确保你的Ajax请求里的
Content-Type和Authorization(如果用了token)头被允许,不然还是会报错; - OPTIONS预检请求是浏览器自动发起的,必须处理它返回200/204,否则跨域请求会被拦截;
- 生产环境一定要限制允许的Origin,不要用通配符
*,防止恶意网站请求你的Odoo接口。
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

