返回
Odoo插件安装后 XML-RPC 连接时报错'object unbound'怎么办?
python
2024-03-26 21:18:25
Odoo:安装插件后连接 XML-RPC 时遇到的问题及解决方案
问题概览
在 Odoo v16 上安装了"Login user Details"插件后,在通过 XML-RPC 连接时会出现以下错误:
[
"faultCode" => 1
"faultString" => """
Traceback (most recent call last):\n
File "/usr/lib/python3/dist-packages/odoo/addons/base/controllers/rpc.py", line 148, in xmlrpc_2\n
response = self._xmlrpc(service)\n
File "/usr/lib/python3/dist-packages/odoo/addons/base/controllers/rpc.py", line 128, in _xmlrpc\n
result = dispatch_rpc(service, method, params)\n
File "/usr/lib/python3/dist-packages/odoo/http.py", line 366, in dispatch_rpc\n
return dispatch(method, params)\n
File "/usr/lib/python3/dist-packages/odoo/service/common.py", line 56, in dispatch\n
return g[exp_method_name](*params)\n
File "/usr/lib/python3/dist-packages/odoo/service/common.py", line 27, in exp_authenticate\n
return res_users.authenticate(db, login, password, {**user_agent_env, 'interactive': False})\n
File "/usr/lib/python3/dist-packages/odoo/addons/base/models/res_users.py", line 798, in authenticate\n
uid = cls._login(db, login, password, user_agent_env=user_agent_env)\n
File "/usr/lib/python3/dist-packages/odoo/addons/base/models/res_users.py", line 773, in _login\n
user._check_credentials(password, user_agent_env)\n
File "/var/lib/odoo/.local/share/Odoo/addons/16.0/login_user_detail/models/login_user_details.py", line 39, in _check_credentials\n
ip_address = request.httprequest.environ['REMOTE_ADDR']\n
File "/usr/lib/python3/dist-packages/werkzeug/local.py", line 432, in __get__\n
obj = instance._get_current_object()\n
File "/usr/lib/python3/dist-packages/werkzeug/local.py", line 554, in _get_current_object\n
return self.__local() # type: ignore\n
File "/usr/lib/python3/dist-packages/werkzeug/local.py", line 226, in _lookup\n
raise RuntimeError("object unbound")\n
RuntimeError: object unbound\n
"""
]
错误信息表明 request
对象不可用。
解决方法
解决此问题的步骤如下:
- 确保启用 HTTP 请求: 使用
@http.route()
装饰器或openerp.http.request
模块启用 HTTP 请求。 - 检查代码块: 确保在使用
request
对象的代码块中正确初始化了对象,通常作为函数参数传递。 - 更新模块: 更新"Login user Details"模块可能包含修复程序。
- 检查日志: 查看 Odoo 日志以获取更多错误信息,有助于确定根本原因。
解决方案代码
以下是更新后的代码示例:
import logging
from itertools import chain
from odoo import models, fields, api, http
_logger = logging.getLogger(__name__)
USER_PRIVATE_FIELDS = ['password']
concat = chain.from_iterable
class LoginUserDetail(models.Model):
_inherit = 'res.users'
@http.route('/web/login', auth='public', type='http')
def _check_credentials(self, password, user_agent_env):
result = super(LoginUserDetail, self)._check_credentials(password, user_agent_env)
ip_address = request.httprequest.environ['REMOTE_ADDR']
vals = {'name': self.name,
'ip_address': ip_address
}
self.env['login.detail'].sudo().create(vals)
return result
常见问题解答
1. 为什么会发生此错误?
此错误通常是由于在使用 request
对象的代码块中未启用 HTTP 请求或未正确初始化对象所致。
2. 如何知道request
对象是否可用?
可以在使用 request
对象的代码块中添加 if not request:
检查来检查其可用性。
3. 如何更新"Login user Details"模块?
转到 Odoo 应用程序菜单中的应用程序部分,搜索"Login user Details"模块,然后单击"更新"按钮。
4. 如何查看 Odoo 日志?
转到 Odoo 应用程序菜单中的设置部分,然后单击"技术"标签下的"日志"选项。
5. 如何避免此错误?
在使用 request
对象的代码块中启用 HTTP 请求并正确初始化对象可以避免此错误。