Python 在odoo的controllers.py文件中,如何在post请求正文中获取json字符串?

Python 在odoo的controllers.py文件中,如何在post请求正文中获取json字符串?,python,json,http,odoo,werkzeug,Python,Json,Http,Odoo,Werkzeug,我在controllers.py文件中定义了一个类来接收HTTP请求。远程服务器发送POST请求,请求正文中的数据是JSON字符串 我可以通过方法http.request.jsonrequest将JSON字符串转换为字典,直接获取请求体中的数据,但是现在,我需要直接获取请求体中的原始JSON字符串,而不是字典来验证签名 无法使用直接转换为json字符串的方法(json.dumps()),因为以这种方式获得的字符串与原始请求正文中的json字符串不同,这可能导致验证签名时失败 我该怎么办?请帮帮我

我在controllers.py文件中定义了一个类来接收HTTP请求。远程服务器发送POST请求,请求正文中的数据是JSON字符串

我可以通过方法http.request.jsonrequest将JSON字符串转换为字典,直接获取请求体中的数据,但是现在,我需要直接获取请求体中的原始JSON字符串,而不是字典来验证签名

无法使用直接转换为json字符串的方法(
json.dumps()
),因为以这种方式获得的字符串与原始请求正文中的json字符串不同,这可能导致验证签名时失败

我该怎么办?请帮帮我。多谢各位

这是我的控制器。py

#-*-编码:utf-8-*-
从odoo导入http
类回调通知(http.Controller):
def安全_判断(自我):
"""
:返回:
"""
header=http.request.httprequest.headers.environ
签名=头['HTTP\u X\u TSIGN\u OPEN\u签名']
时间戳=头['HTTP\u X\u TSIGN\u OPEN\u TIMESTAMP']
remote\u addr=http.request.httprequest.remote\u addr
如果远程地址!='47.99.80.224':
返回
@http.route('/signature/process/my_odoo',type='json',auth='none')
def接收机构认证(自身,**千瓦):
"""
:参数千瓦:
:返回:
"""
自我安全(判断)
request\u body=http.request.jsonrequest
action=请求体['action']
flow\u num=请求\u正文['flowId']
http_env=http.request.env
sign_process_id=http_env['sign.process'].sudo().search([('flow_num','=',flow_num)]).id
如果操作=='SIGN\u FLOW\u UPDATE':
第三顺序=请求主体['thirdOrderNo']
name\u id\u user\u list=third\u order.split(','))
模型=名称\u id\u用户\u列表[0]
记录\u id=名称\u id\u用户\u列表[1]
批准用户id=名称用户id用户列表[2]
如果批准用户id!='p':
record\u obj=http\u env[model].sudo(user=int(approve\u user\u id)).browse(int(record\u id))
签名结果=请求正文['signResult']
结果描述=请求正文['resultDescription']
account\u num=请求\u正文['accountId']
组织或账户数量=请求主体['authorizedAccountId']
sign_user_id=http_env['sign.users'].sudo().search([('account_num','=',account_num)]).id
http_manual_env=http_env['manual.sign'].sudo()
如果账户数量==组织数量或账户数量:
manual_id=http_manual_env.search([('sign_process_id','=',sign_process_id),
('sign_user_id','=',sign_user_id)]).id
其他:
institution_id=http_env['institution.account'].sudo().search([('org_num','=',org_或_account_num)]).id
manual_id=http_manual_env.search([('sign_process_id','=',sign_process_id),
('sign_user_id','=',sign_user_id),
('institution_id','=',institution_id)].id
如果符号_结果==2:
http_manual_env.browse(manual_id).write({'sign_result':'success'))
http.request.\u cr.commit()
如果批准用户id!='p':
记录对象批准行动(“批准”、“批准”)
其他:
http_env[model].sudo().browse(int(record_id)).write({'partner_sign_state':'success'))
elif sign_result==3:
http_manual_env.browse(manual_id).write({'sign_result':'failed'))
如果批准用户id='p':
http_env[model].sudo().browse(int(record_id)).write({'partner_sign_state':'failed'))
elif sign_result==4:
http_manual_env.browse(manual_id).write({'sign_result':'reject'})
http.request.\u cr.commit()
如果批准用户id!='p':
记录对象批准操作(“拒绝”,结果描述)
其他:
http_env[model].sudo().browse(int(record_id)).write({'partner_sign_state':'reject','partner_reject_reason':result_description})

要获取原始车身数据,可以使用以下代码:

raw_body_data = http.request.httprequest.data

要获取原始实体数据,可以使用以下代码:

raw_body_data = http.request.httprequest.data
皮冲

您可以将值从
JSON-RPC
发送到
JSON控制器

Js文件: 其中在像这样调用控制器之前传递值

var ajax = require('web.ajax');
ajax.jsonRpc("/custom/url", 'call', {'Your Key': Your Value}).then(function(data) {
    if (data) {
        // Code
    } else {
       // Code
}});
Py文件: 像这样从帖子中获取数据

@http.route(['/custom/url'], type='json', auth="public", website=True)
def custom_cotroller(self, **post):
    get_data = post.get('Your Key')
    # Your Customise Code
谢谢你

您可以将值从
JSON-RPC
发送到
JSON控制器

Js文件: 其中在像这样调用控制器之前传递值

var ajax = require('web.ajax');
ajax.jsonRpc("/custom/url", 'call', {'Your Key': Your Value}).then(function(data) {
    if (data) {
        // Code
    } else {
       // Code
}});
Py文件: 像这样从帖子中获取数据

@http.route(['/custom/url'], type='json', auth="public", website=True)
def custom_cotroller(self, **post):
    get_data = post.get('Your Key')
    # Your Customise Code

谢谢

@Dipen Shah@CoolFlash95@Charif DZ 大家好,我已经找到了这个问题的解决方案。但是当我制定解决方案时,我希望我们能够理解问题的根本原因,所以让我们来检查一下odoo的源代码

在Odoo10中
request=self.httprequest.stream.read()
,然后
self.jsonrequest=json.load(请求)

在奥多奥11
request=self.httprequest.get_data().decode(self.httprequest.charset)
,然后
self.jsonrequest=json.load(request)

我们发现
JsonRequest
self
对象具有类型为dict的属性
JsonRequest
。不幸的是,源代码不允许
self
具有'other'属性,该属性包含请求正文中的原始字符串。但是,添加'other'属性非常容易,为什么不呢