2016-05-09 6 views
3

Несколько дней назад у меня был аналогичный вопрос: 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.

+0

Возможно, ваш недостающий csrf_token? – mokiSRB

+0

Благодарим вас за ответ @mokiSRB, но 'csrf_token' - это новая функция Odoo 9, и я работаю с Odoo 8, так что это не проблема. Я вижу другие контроллеры JSON в Odoo, и все они вызываются из JavaScript с такими библиотеками, как 'openerp.jsonRpc'. Как я могу отправить данные на контроллер из простого сценария Python (например, используя 'запросы'), как и выше? – forvas

ответ

3

Вы просто забыли поставить свои данные внутри Params Ключевые слова:

Используйте этот правильный синтаксис:

data = {"params": dict(key="value")}

data = { 
    "params": { 
     "name":"prakashsharma", 
     "email":"[email protected]", 
     "phone":"+917859884833" 
    } 
} 

Пожалуйста, не забудьте использовать json.dumps(data) и 'Content-Type': 'application/json' при запросе ресурс в формате json.

Я чертовски уверен, что ваша проблема будет решена после использования этого моего друга ... приветствия :) !!

+0

это была именно проблема! Ты мне очень помог! Большое спасибо, мой друг!! – forvas

+0

@forvas: Можно ли получить доступ к этому с другой платформы? всякий раз, когда я пытаюсь получить доступ к этому URL-адресу от Postman, он возвращал 404. Но можно получить доступ из браузера, в который пользователь вошел. –

+0

@MuneerMuhammed да, это, на самом деле, сайт клиента отправлял эти данные JSON мой Оду. – forvas

-1

God Bless Forvas :: Но для более clearity: если вы хотите проверить через Скручивание

curl -i -X POST -H "Content-Type: application/json" -d '{"params": {"name":"prakashsharma","email":"[email protected]","phone":"+917859884833"}}' 'http://localhost:8069/web/yourlistoner/' 

если вы хотите проверить через запрос питона:

import requests 

headers = { 
    'Content-Type': 'application/json', 
} 

data = '{"params": {"name":"prakashsharma","email":"[email protected]","phone":"+917859884833"}}' 

requests.post('http://localhost:8069/web/yourlistoner/', headers=headers, data=data) 

функция в odoo будет что-то вроде

from odoo import http 
import json 

class YourClass(http.Controller): 
    @http.route('/web/yourlistoner/', type='json', auth="none", methods=['POST'],cors="*", csrf=False) 
    def listoner(self, **kw): 

     print http.request.params 
     print "lllllllllllllllllllll" 
     return json.dumps({"result":"Success"}) 

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

  • Нет связанных вопросов^_^