在odoo的控制器文件中,当类型为json时,如何更改json响应格式

2024-05-16 14:02:00 发布

您现在位置:Python中文网/ 问答频道 /正文

请求头中的应用程序/json和请求正文中的json字符串当我启动http请求时,Odoo服务器接收请求,但返回给客户端的json不是我想要返回的

这里有两个额外的键,jsonrpcidresult。对应于键result的字典是我真正想要返回给客户机的

如果我将http.route中的type变量改为http而不是json,我将无法从客户端接收json格式的数据

我该怎么办?谢谢大家

我的Odoo版本是10,python版本是2.7.12

这是我的密码

控制器.py

from odoo.http import Controller,route
class API(Controller):
    @route('/v1/access_something',type='json',auth='none',csrf=False,methods=['GET'])
    def access_something(self,**kwargs):
        return {"a":1,"b":2}

requests的测试接口

import requests
re = requests.get('http://192.168.1.55:8069/v1/access_something',json={"c":1},headers={'Content-Type':'application/json'})
print(re.json())

{}中的数据

{
    "jsonrpc": "2.0",
    "id": null,
    "result": {
        "a": 1,
        "b": 2
    }
}

但是下面的结果就是我想要的

{
    "a": 1,
    "b": 2
}


Tags: 数据odooimport版本idjsonhttp客户端
1条回答
网友
1楼 · 发布于 2024-05-16 14:02:00

我找到了解决这个问题的办法

出现这个问题是因为在源代码JsonRequest中有一个方法_json_response,我们可以动态覆盖它

为了不干扰其他人对原始框架的使用,我们可以使用kwargs在自己的decorator @http.route中传递自己的特定参数。我们通过确定decorator是否有我们自己的参数来构造json字典,以返回给客户机

这是我的代码controllers.py

from odoo.http import Controller,route,JsonRequest

def _json_response(self, result=None, error=None):
    lover = self.endpoint.routing.get('lover')
    if lover == 'chun':
        response = {}
        if error is not None:
            response['error'] = error
        if result is not None:
            response = result
    else:
        response = {
            'jsonrpc': '2.0',
            'id': self.jsonrequest.get('id')
        }
        if error is not None:
            response['error'] = error
        if result is not None:
            response['result'] = result

    if self.jsonp:
        # If we use jsonp, that's mean we are called from another host
        # Some browser (IE and Safari) do no allow third party cookies
        # We need then to manage http sessions manually.
        response['session_id'] = self.session.sid
        mime = 'application/javascript'
        body = "%s(%s);" % (self.jsonp, json.dumps(response),)
    else:
        mime = 'application/json'
        body = json.dumps(response)

    return Response(
        body, headers=[('Content-Type', mime),
                       ('Content-Length', len(body))])

setattr(JsonRequest,'_json_response',_json_response) #overwrite the method

class API(Controller):
    @route('/v1/access_something',type='json',auth='none',csrf=False,methods=['GET'],lover='chun')
    def access_something(self,**kwargs):
        return {"a":1,"b":2}

具体参数lover='chun'是我们判断的基础,在方法_json_response中,我们可以通过self.endpoint.routing.get('lover')得到这个参数

相关问题 更多 >