响应状态200 odoo 9

时间:2017-02-20 18:41:07

标签: openerp 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": []}}}

1 个答案:

答案 0 :(得分:3)

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

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

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

他们在这里。

  1. db_filter :启动脚本或服务器配置文件中包含的正则表达式。防爆。 db_filter = %d(启动脚本中为--db_filter %d)在此示例http://test.com中,数据库将被称为test
  2. 查询字符串http://test.com?db=test,Odoo中的某些处理程序将使用此查询字符串来确定用于请求的数据库。
  3. 会话ID :客户端(主要是网络浏览器)将存储包含会话ID的cookie,并将每个请求传递给服务器“session_id = 95bbc53e2ac4d02f50a8d6bf678602112a072807”
  4. 您知道的错误是您的服务器说它无法确定响应您的请求的数据库。如果您需要将会话ID传递给带有请求的服务器,则可以使用jsonrpc进行身份验证。存储会话ID并将其传递到后续请求的标头中。

    以下是获取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})