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)

 

 

 

posted @ 2023-06-19 00:02  何双新  阅读(321)  评论(0编辑  收藏  举报