终于解决了这个问题。这是一个 CORS 问题,我通过修改 nginx.conf 中的代码修复了这个问题,如下所示:
upstream odoo {
server 127.0.0.1:8069;
}
server {
listen 443 default;
server_name localhost;
root c:/nginx/html;
index index.html index.htm;
access_log c:/nginx/logs/odoo.access.log;
error_log c:/nginx/logs/odoo.error.log;
proxy_buffers 16 64k;
proxy_buffer_size 128k;
location / {
proxy_pass http://odoo;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,access-control-allow-origin,x-openerp-session-id,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'application/json charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,access-control-allow-origin,x-odoo-session-id,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Allow-Credentials' 'true';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,access-control-allow-origin,x-odoo-session-id,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Allow-Credentials' 'true';
}
}
location ~* /web/static/ {
proxy_cache_valid 200 60m;
proxy_buffering on;
expires 864000;
proxy_pass http://odoo;
}
}
请注意: In the Access-Control-Allow-Origin
标头,我指定了我正在处理的应用程序的地址和端口,http://localhost:8080
。你可以把'*'
相反或任何适合您的地址。另外,Access-Control-Allow-Credentials
除非您计划从应用程序发送身份验证 cookie/标头以从服务器访问某些路由,否则标头不是必需的。就我而言,我添加了参数withCredentials: true
到我的 axios 调用,因此我必须添加Access-Control-Allow-Credentials : true
标头至nginx.conf
,并且还必须指定我的 vue 应用程序的地址和端口。 (本地主机:8080)。
或者,如果您使用 Odoo Web 控制器,则无需 Nginx,只需添加cors='*'
装饰器到您的网络控制器声明。这是一个例子:
@http.route('/vuews/msg/', auth='none', type='json', methods=['POST', 'GET', 'OPTIONS'], cors='*', csrf=False)
Bonus:如果您计划通过 HTTP POST 请求将数据发送到 Odoo Web 控制器,请务必将其包含在params: {}
像这样:
data: {
jsonrpc: '2.0',
method: 'call',
id: 1,
params: {
message: 'Hello World'
}
},
然后您可以在后台访问它并通过post
对象,前提是您在控制器的函数参数中声明了它,如下所示:
@http.route('/vuews/msg/', auth='none', type='json', methods=['POST', 'GET', 'OPTIONS'], csrf=False)
def answermsg(self, **post):
// do something here... ex: data = post;
我希望这可以帮助任何遇到这个问题的人。如果您需要帮助,请随时与我联系。