odoo16跨域问题解决办法--适用app端、web端、跨系统接口
Odoo的跨域问题:
由于浏览器的同源策略所引起的。同源策略是一种安全策略,它限制了一个源(协议、域名、端口)的文档或脚本如何与另一个源的资源进行交互。
如果两个源不同,则无法进行跨域交互。因此,如果Odoo应用程序在一个域名下运行,而客户端在另一个域名下运行,则会出现跨域问题。
为了解决Odoo的跨域问题,可以在Odoo的Nginx或Apache等Web服务器中进行配置。以下是一些可能的解决方法:
一、通过nginx配置
在Nginx中添加跨域头信息 在Nginx的配置文件中添加以下内容: location / { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; ... }
这里将Access-Control-Allow-Origin设置为*,表示允许所有域名访问。
二、如果是odoo内部应用的接口,一般在接口加上cors="*" 参数就行
可以在Controller接口上配置参数,如: @http.route("/", type='json', auth="none", csrf=False, method=["POST"],website=True, cors="*") 这样前端在进行接口调用的时候,就可以调通了,跨域问题就解决了。
三、可以使用Odoo的CORS模块来解决跨域问题,可以在请求头中 加入。'Access-Control-Allow-Origin' '*' 永久解决
# -*- coding: utf-8 -*- import json import jinja2 import sys import os import logging from odoo.http import JsonRequest, Response from odoo.tools import date_utils _logger = logging.getLogger(__name__) def _json_response(self, result=None, error=None): # 自定义odoo接口返回数据格式,获取到参数ext就直接返回json数据,否则就返回默认数据格式 """ { 'jsonrpc': '2.0', 'id': 12, 'result': {} } """ if self.endpoint and self.endpoint.routing.get('ext'): response = {} if error is not None: response = { 'jsonrpc': '2.0', 'id': self.jsonrequest.get('id') } response['error'] = error if result is not None: response = result else: # odoo返回的默认数据格式 response = { 'jsonrpc': '2.0', 'id': self.jsonrequest.get('id') } if error is not None: response['error'] = error if result is not None: response['result'] = result mime = 'application/json' body = json.dumps(response, default=date_utils.json_default) return Response( body, status=error and error.pop('http_status', 200) or 200,
# 解决接口跨域问题,比如app与应用后台的接口跨域 headers=[('Content-Type', mime),('Access-Control-Allow-Origin', '*'),('Content-Length', len(body))] ) # 重写JsonRequest中的_json_response方法 setattr(JsonRequest, '_json_response', _json_response)
心有猛虎,细嗅蔷薇