2017-02-20 7 views
0

После вызова request.post в консоли получите код ошибки и статуса 200.Состояние ответа 200 odoo 9

Как получить данные от контроллера?

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

ответ

3

Ваш odoo сервер реагирует с ошибкой, потому что не уверен, что базы данных для ответа. Вероятно, у вас есть несколько баз данных.

Сервер Odoo способен одновременно размещать несколько баз данных. Когда вы делаете запрос на сервер Odoo, одна из них, если не самая первая, что он делает, определяет, какой экземпляр или база данных должен обрабатывать запрос, поскольку каждая база данных может иметь разные модули и различные пользователи/данные и, следовательно, тот же запрос каждая база данных, скорее всего, будет обрабатываться по-разному и даст разные результаты.

Существует несколько способов сообщить серверу, какая база данных должна быть нацелена для каждого запроса. Некоторые из них являются контекстуальными, и я не знаю, доступен ли документ, чтобы действительно объяснить, когда он релевантен, а другой нет.

Вот они.

  1. db_filter: Регулярное выражение содержится в сценарии запуска или в файле конфигурации сервера. Ex. db_filter = %d (--db_filter %d в сценарии запуска) в этом примере http://test.com базы данных будет называться test
  2. Строка запроса: http://test.com?db=test, некоторые обработчики в Odoo будет использовать эту строку запроса, чтобы определить, какую базу данных использовать для запроса.
  3. Session Id: Клиенты (в основном веб-браузеры) будет хранить куки, содержащий идентификатор сеанса и передать его на сервер с каждым запросом «session_id = 95bbc53e2ac4d02f50a8d6bf678602112a072807»

Нижняя линия ошибки вы получаете это что ваш сервер говорит, что он не может определить, какая база данных будет отвечать на ваш запрос. Если вам нужен идентификатор сеанса для передачи на сервер с запросом, вы можете использовать jsonrpc для аутентификации. Сохраните идентификатор сеанса и передайте его в заголовках последующих запросов.

Вот пример запрос для получения 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}) 
+0

+1 плюс один небольшой совет: вы можете проверить - если ошибка связана с базой данных или отсутствующей базой данных - в журналах. Каждая строка журнала привязана к db, поэтому, если вы не видите имя базы данных в строке вашего вызова, тогда это проблема. AFAIR вы действительно получаете NotFound, когда база данных не выбрана. – simahawk

Смежные вопросы