返回

Odoo插件安装后 XML-RPC 连接时报错'object unbound'怎么办?

python

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 对象不可用。

解决方法

解决此问题的步骤如下:

  1. 确保启用 HTTP 请求: 使用 @http.route() 装饰器或 openerp.http.request 模块启用 HTTP 请求。
  2. 检查代码块: 确保在使用 request 对象的代码块中正确初始化了对象,通常作为函数参数传递。
  3. 更新模块: 更新"Login user Details"模块可能包含修复程序。
  4. 检查日志: 查看 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 请求并正确初始化对象可以避免此错误。