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

如何从JS调用Odoo控制器函数?请求类型不匹配错误求助

问题原因分析

你遇到的错误核心是请求类型不匹配:你的JS代码用this._rpc()发起的是JSON-RPC请求,但后端Python路由通过http.request.render返回的是HTML模板渲染结果(属于普通HTTP响应)。Odoo的路由机制会校验请求类型与处理函数的能力,因此触发了这个不兼容报错。

另外必须提醒:你原Python代码里的SQL拼接存在严重的SQL注入风险,直接把用户输入拼进SQL语句是绝对不安全的,后面的解决方案会同步修复这个问题。


解决方案(二选一,根据你的需求选择)

方案1:修改Python路由返回JSON(推荐,适配JS的RPC调用)

如果你的需求是获取数据后在JS里自行处理,那让后端返回JSON格式数据是最匹配的方式:

import json
from odoo import http

@http.route('/some/route/', website=True, auth='public', csrf=False, methods=['POST']) 
def get_data(self, **kw): 
    condition = kw.get('search', '')
    # 修复SQL注入:使用参数化查询,绝对不要直接拼接用户输入
    sql = """ select name from res_partner where phone = %s or email = %s """
    http.request.cr.execute(sql, (condition, condition)) 
    result = http.request.cr.fetchall() or [] 
    # 简化数据处理逻辑
    data = [''.join(item) for item in result]
    # 返回JSON格式响应
    return http.Response(
        json.dumps(data),
        content_type='application/json;charset=utf-8',
    )

JS代码无需修改,原来的_rpc调用可以直接接收返回的JSON数组,后续可以用self._result = data做页面渲染逻辑。

方案2:修改JS用普通AJAX请求(如果需要后端直接返回HTML)

如果你的需求是让后端渲染好HTML片段再插入页面,那可以放弃_rpc,改用普通AJAX请求:

_onKeydown_searchText: function () { 
    var self = this; 
    var searchInput = self.$('#text_input').val().trim(); 
    if (event.keyCode == 13 && searchInput) { 
        $.ajax({
            url: '/some/route/',
            method: 'POST',
            data: { search: searchInput },
            success: function(htmlContent) {
                // 把后端返回的HTML插入到页面指定容器,比如:
                // self.$('.search-result-area').html(htmlContent);
                console.log('渲染好的HTML:', htmlContent);
            },
            error: function(err) {
                console.error('请求失败:', err);
            }
        });
    } 
},

这种情况下,你的原Python路由可以保留http.request.render的逻辑,但同样要记得修复SQL注入问题(参考方案1里的参数化查询写法)。


内容的提问来源于stack exchange,提问作者lè chang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:47:27