【发布时间】:2016-05-09 09:19:18
【问题描述】:
几天前我在这里做了一个类似的问题:How to get JSON data in an Odoo controller?
但是现在,我需要创建一个只接收 JSON 数据的控制器。所以,我正在从 Python 控制台发出请求,这样:
import requests
import json
url = 'http://localhost:8069/odoo/test'
headers = {'Content-Type': 'application/json'}
data = {
'name': 'Jane',
'email': 'jane.doe@gmail.com',
}
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。我可以在日志中读取CONNECTION SUCCESFUL,没有错误,但是当我显示args 时,我得到{},显然正因为如此,False 在写入name 和@ 时987654330@.
如果我将数据作为 Python 字典或字符串传递,则会收到以下错误:
Invalid JSON data: 'name=Jane&email=jane.doe%40gmail.com' 或
分别为Invalid JSON data: "{'name': 'Jane', 'email': 'jane.doe@gmail.com'}"。
如果我修改 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,但
csrf_token是Odoo 9 的新功能,我正在使用Odoo 8,所以这应该不是问题。我在 Odoo 中看到了其他 JSON 控制器,它们都是从 JavaScript 调用的,带有openerp.jsonRpc之类的库。如何从一个简单的 Python 脚本(例如使用requests)向控制器发送数据? -
当我使用 rest api 和 Odoo 时,我通常从 Postman 查询开始,然后复制代码,由于某些原因,请求不适用于
curl,但它适用于 postman,这是由于到需要转义的双引号符号,另见:stackoverflow.com/questions/32122586/curl-escape-single-quote/…
标签: json python-2.7 controller odoo-8 odoo