You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过AJAX调用下述xmlrpc.py脚本?

能否通过AJAX调用本地运行的xmlrpc.py脚本?

首先直接给结论:不行。原因很简单——AJAX是前端浏览器向Web服务器发起的HTTP请求,而你现在的xmlrpc.py只是一个在本地终端运行的Python脚本,它并没有对外提供可被AJAX访问的Web服务端点,浏览器根本没法直接和它通信。

当你在终端运行这个脚本时,它只是在本地环境里直接调用Odoo的XML-RPC接口完成操作,完全没有涉及HTTP服务的部分,所以AJAX请求根本触达不了它。

那怎么实现类似需求?

你需要把这个XML-RPC逻辑封装成一个Web API接口,让它能接收HTTP请求,然后前端通过AJAX调用这个接口。这里给你一个用Flask(轻量Python Web框架)实现的简单方案:

步骤1:搭建Web服务

首先安装所需依赖:

pip install flask flask-cors

然后创建一个新的脚本app.py,把你的XML-RPC逻辑封装成接口:

from flask import Flask, jsonify
from flask_cors import CORS
# Python3注意:xmlrpclib已重命名为xmlrpc.client,Python3环境请替换为下面的导入
# import xmlrpc.client as xmlrpclib
import xmlrpclib

app = Flask(__name__)
# 解决跨域问题,允许前端页面跨域访问接口
CORS(app)

@app.route('/get-contacts', methods=['GET'])
def get_contacts():
    # 建议把账号密码这类敏感信息放到环境变量或配置文件中,不要硬编码在代码里
    username = 'admin'
    pwd = 'admin'
    dbname = 'db_1'
    
    try:
        # 连接Odoo的XML-RPC服务
        sock_common = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/common')
        uid = sock_common.login(dbname, username, pwd)
        sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')
        
        # 执行你的业务逻辑:查询所有联系人ID
        contact_ids = sock.execute(dbname, uid, pwd, 'res.partner', 'search', [])
        # 如果需要获取联系人详细信息,可以调用read方法
        # contacts = sock.execute(dbname, uid, pwd, 'res.partner', 'read', contact_ids)
        
        return jsonify({
            'success': True,
            'contact_ids': contact_ids
        })
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        })

if __name__ == '__main__':
    # 允许外部访问服务,端口设为5000
    app.run(host='0.0.0.0', port=5000, debug=True)

步骤2:运行Web服务

在终端执行:

python app.py

步骤3:前端AJAX调用

这里给你原生JS和jQuery两种示例:

// 原生JS示例
fetch('http://localhost:5000/get-contacts')
  .then(response => response.json())
  .then(data => {
    if (data.success) {
      console.log('获取到的联系人ID列表:', data.contact_ids);
      // 这里可以把数据渲染到页面上
    } else {
      console.error('请求出错:', data.error);
    }
  })
  .catch(error => console.error('网络请求失败:', error));
// jQuery示例
$.ajax({
    url: 'http://localhost:5000/get-contacts',
    method: 'GET',
    success: function(data) {
        if (data.success) {
            console.log('获取到的联系人ID列表:', data.contact_ids);
        } else {
            console.error('请求出错:', data.error);
        }
    },
    error: function(xhr, status, error) {
        console.error('网络请求失败:', error);
    }
});

关键注意事项

  • 跨域问题:如果你的前端页面和Flask服务不在同一个域名/端口,必须添加flask-cors来解决浏览器的跨域限制,否则请求会被拦截。
  • 安全性:绝对不要把账号、密码这类敏感信息硬编码在代码里,建议用环境变量或者专门的配置文件管理,避免信息泄露。
  • Python版本兼容:Python3环境下,xmlrpclib已经重命名为xmlrpc.client,记得替换导入语句。

内容的提问来源于stack exchange,提问作者Pointer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:38