响应状态 200 odoo 9

Response status 200 odoo 9

在控制台中调用 requests.post 后出现错误和状态代码 200。

如何从控制器获取数据?

Controller.py

import json

@http.route('/test_json', type="json", auth="public")
def some_json(self):
    return json.dumps({"name": "Odoo", 'website': 'www.123.com'},{"name": "Odoo 2", 'website': 'www.456.com'})

按钮点击调用

import requests,json

res = requests.post("http://localhost:8069/test_json",data=json.dumps({}),headers={"Content-Type":"application/json"})
body = res.text
print(body)

在控制台中获取:

{"jsonrpc": "2.0", "id": null, "error": {"message": "Odoo Server Error", "code": 200, "data": {"debug": "Traceback (most recent call last):\n  File \"/home/pc/git/odoo/openerp/http.py\", line 648, in _handle_exception\n    return super(JsonRequest, self)._handle_exception(exception)\n  File \"/home/pc/git/odoo/openerp/http.py\", line 1631, in _dispatch_nodb\n    func, arguments = self.nodb_routing_map.bind_to_environ(request.httprequest.environ).match()\n  File \"/usr/lib/python2.7/dist-packages/werkzeug/routing.py\", line 1433, in match\n    raise NotFound()\nNotFound: 404: Not Found\n", "exception_type": "internal_error", "message": "", "name": "werkzeug.exceptions.NotFound", "arguments": []}}}

您的 odoo 服务器正在响应错误,因为它不确定从哪个数据库响应。您可能有多个数据库。

Odoo 服务器能够同时托管多个数据库。当您向 Odoo 服务器发出请求时,如果不是它做的第一件事就是确定应该由哪个实例或数据库处理请求,因为每个数据库可能安装了不同的模块和不同的用户/数据,因此相同的请求到每个数据库很可能会以不同的方式处理并产生不同的结果。

有多种方法可以告诉服务器每个请求应该针对哪个数据库。其中一些是上下文相关的,我不知道是否有文档可以真正解释什么时候一个是相关的而另一个是不相关的。

他们在这里。

  1. db_filter:包含在启动脚本或服务器配置文件中的正则表达式。前任。 db_filter = %d(启动脚本中的--db_filter %d)在此示例中http://test.com 数据库将被称为test
  2. 查询字符串http://test.com?db=test,Odoo 中的某些处理程序将使用此查询字符串来确定用于请求的数据库。
  3. Session Id:客户端(主要是网络浏览器)将存储一个包含 session id 的 cookie,并在每次请求时将其传递给服务器 "session_id=95bbc53e2ac4d02f50a8d6bf678602112a072807"

最重要的是,您收到的错误是您的服务器说它无法确定用哪个数据库来响应您的请求。如果您需要一个 session id 与请求一起传递给服务器,您可以使用 jsonrpc 进行身份验证。存储 session id 并在后续请求的 headers 中传递。

这里是获取session_id

的示例请求
url = 'http://localhost:8069/web/session/authenticate'
data = {
        'jsonrpc':'2.0',
        'method':'call',
        'params':{
                  'context':{},
                  'db':'db_name',
                  'login':'admin',
                  'password':'admin'
                 },
        'id': null
       }

res = requests.post(url, data=data, headers={"Content-Type":"application/json"})

print(res.text)

# YOU WILL HAVE TO PARSE THE RESULT YOURSELF I AM NOT SURE THE RESPONSE OBJECT WILL BE AS BELOW
session_id = res.text['results']['session_id']

现在在您的请求中使用 session_id。

res = requests.post('http://localhost:8069/test_json', headers={"Content-Type":"application/json"}, cookies={'session_id': session_id})