在控制台中调用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": []}}}
答案 0 :(得分:3)
您的odoo服务器正在响应错误,因为它不确定要响应的数据库。您可能拥有多个数据库。
Odoo服务器能够同时托管多个数据库。当你向Odoo服务器发出请求时,如果不是它做的第一件事就是确定应该处理请求的实例或数据库,因为每个数据库可能安装了不同的模块和不同的用户/数据,因此请求每个数据库很可能会以不同的方式处理并产生不同的结果。
有多种方法可以告诉服务器每个请求应该针对哪个数据库。其中一些是上下文的,我不知道是否有文件可以真实地解释何时相关而另一个不相关。
他们在这里。
db_filter = %d
(启动脚本中为--db_filter %d
)在此示例http://test.com中,数据库将被称为test
您知道的错误是您的服务器说它无法确定响应您的请求的数据库。如果您需要将会话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})