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)