如何从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
相关产品推荐
相关产品推荐

