Несколько дней назад у меня был аналогичный вопрос: How to get JSON data in an Odoo controller?Как получить данные JSON в контроллере Odoo, используя type = 'json'?
Но теперь мне нужно создать контроллер, который получает только данные JSON. Таким образом, я делаю запрос от консоли Python, таким образом:
import requests
import json
url = 'http://localhost:8069/odoo/test'
headers = {'Content-Type': 'application/json'}
data = {
'name': 'Jane',
'email': '[email protected]',
}
data_json = json.dumps(data)
r = requests.post(url=url, data=data_json, headers=headers)
Я создал контроллер, который прислушивается к http://localhost:8069/odoo/test, таким образом:
import openerp.http as http
from openerp.http import Response
import logging
_logger = logging.getLogger(__name__)
class WebFormController(http.Controller):
@http.route('/odoo/test', type='json',
auth='public', methods=['POST'], website=True)
def index(self, **args):
_logger.info('CONNECTION SUCCESSFUL')
_logger.info(args)
name = args.get('name', False)
email = args.get('email', False)
_logger.info(name)
_logger.info(email)
if not name:
Response.status = '400 Bad Request'
return '{"response": "OK"}'
Проблема заключается в том, что я получаю пустой JSON в контроллере. Я могу читать СОЕДИНЕНИЯ успешных в журнале, без каких-либо ошибок, но когда я показываю args
, я получаю {}
, и, очевидно, из-за того, False
при написании name
и email
.
Если я передать данные как словарь Python или в виде строки, я получаю следующее сообщение об ошибке:
Invalid JSON data: 'name=Jane&email=jane.doe%40gmail.com'
или Invalid JSON data: "{'name': 'Jane', 'email': '[email protected]'}"
соответственно.
Если я изменить type='json'
и я пишу type='http'
вместо этого, я получаю следующее сообщение об ошибке:
Function declared as capable of handling request of type 'http' but called with a request of type 'json'
.
Я прочитал, что может быть это может быть решена, если запрос посылается с помощью параметра json
вместо data
, таким образом:
r = requests.post(url=url, json=data_json, headers=headers)
К сожалению, сервер, который собирается сделать запрос имеет старой операционной системы, которая не может обновить пакет python-requests
, поэтому я не могу использовать параметр json
, так как он не существовал в версии, установленной на этом сервере.
Пожалуйста, можете мне помочь? Мне нужно получить данные JSON в контроллере, а не ни слова ни слова Python.
Возможно, ваш недостающий csrf_token? – mokiSRB
Благодарим вас за ответ @mokiSRB, но 'csrf_token' - это новая функция Odoo 9, и я работаю с Odoo 8, так что это не проблема. Я вижу другие контроллеры JSON в Odoo, и все они вызываются из JavaScript с такими библиотеками, как 'openerp.jsonRpc'. Как я могу отправить данные на контроллер из простого сценария Python (например, используя 'запросы'), как и выше? – forvas