• Odoo 接口


    1. 很多人还是习惯使用restful格式进行接口操作,但odoo已默认jsonrpc,所以需要专门写一个装饰器

    def json_response(func):
        """返回去除封装的JSON"""
        @wraps(func)
        def decorate(*args, **kwargs):
            request.__raw_json = True
            if hasattr(request, 'jsonrequest'):
                kwargs.update(request.jsonrequest)
            ret = func(*args, **kwargs)
            mime = 'application/json'
            body = json.dumps(ret, ensure_ascii=False, sort_keys=True)
            resp = Response(
                body, status=200,
                headers=[('Content-Type', mime), ('Content-Length', len(body)),
                         ('Access-Control-Allow-Origin', '*')]
            )
            return resp
        return decorate
    # 在最外层加即可,不出意外,最内层也可,反正自由调位置吧!
    @json_response
        @http.route(['/api/post/erp/productcenter/sync'], type='json', auth='public', website=True, csrf=False, cors="*", methods=['POST'])
        def sync_product_info(self, **params):

    2. 若接口使用者使用接口不频繁,完全无必要设session,因为odoo的session默认为一周;若数据保密性强,应每次访问都进行登录。

    from odoo.addons.web.controllers.main import ensure_db
    
    ensure_db()
    uid = request.session.authenticate(request.session.db, str(params.get('user')), str(params.get('password')))
    # ensure_db() 保证有仅一个数据库
    # request.session.db 返回数据库名字
    # str(params.get('user')) 获取user值,视情况从不同位置获取,此为post请求,最终把全代码贴上
    # uid 从数据库查找到账号密码所对的用户id,是一个id值,有2个目的:1检验是否登录成功,若密码账号错误,则uid为false  2因为调接口的用户不一定拥有查看某个表的权限,所以此uid可以作为赋予权限使用 product_count = request.env['xxx.product.center.update.interface'].sudo(uid).search_count([])

    3.接口最好考虑到各种报错,所以进行报错收集

    4.参数解析

    .@http.route(['/api/erp/productcenter/count'], type='http', auth='public', website=True, cors="*")
    # cors="*" 防跨域
    #  ['/api/erp/productcenter/count'] path不包括端口和ip
    # type='http' 分http和json等
    # auth='public' 分none,user,auth,user只需能登录就算数

    5.代码参考,多多交流

    # -*- coding: utf-8 -*-
    
    import json
    import logging
    from odoo import http, _
    from functools import wraps
    from odoo.http import request, Response
    from odoo.addons.web.controllers.main import ensure_db
    
    _logger = logging.getLogger(__name__)
    
    
    def json_response(func):
        """返回去除封装的JSON"""
        @wraps(func)
        def decorate(*args, **kwargs):
            request.__raw_json = True
            if hasattr(request, 'jsonrequest'):
                kwargs.update(request.jsonrequest)
            ret = func(*args, **kwargs)
            mime = 'application/json'
            body = json.dumps(ret, ensure_ascii=False, sort_keys=True)
            resp = Response(
                body, status=200,
                headers=[('Content-Type', mime), ('Content-Length', len(body)),
                         ('Access-Control-Allow-Origin', '*')]
            )
            return resp
        return decorate
    
    
    class xxxProductCenterAPI(http.Controller):
    
        @json_response
        @http.route(['/api/post/erp/productcenter/sync'], type='json', auth='public', website=True, csrf=False, cors="*", methods=['POST'])
        def sync_product_info(self, **params):
            """
            产品中心产品数据同步接口
            :param start_num: 要查找的数据起始条码
            :param end_num: 要查找的数据终止条码
            :return: 接口返回值
            """
            ensure_db()
            uid = request.session.authenticate(request.session.db, str(params.get('user')), str(params.get('password')))
            if uid:
                try:
                    start_num = params.get('start_num', 0)
                    end_num = params.get('end_num', 1000)
                    product_count = request.env['xxxproduct.center.update.interface'].sudo(uid).search_count([])
                    if int(start_num) < int(end_num) and product_count > start_num:
                        product_objs = request.env['xxx.product.center.update.interface'].sudo(uid).search([], limit=min(1000, end_num - start_num), offset=start_num, order='id DESC')
                        product_obj_list = []
                        for product_obj in product_objs:
                            data = {
                                'operatorType': product_obj.operatorType
                            }
                            product_obj_list.append(data)
                        code = 0
                        msg = '已返回%s条数据!'%len(product_obj_list)
                        result = product_obj_list
                    else:
                        code = -2
                        msg = '起始或终止页码输入有误!'
                        result = ''
                except Exception, e:
                    code = -3
                    msg = list(e)[0]
                    result = ''
    
                response = {
                    'code': code,
                    'msg': msg,
                    'result': result
                }
            else:
                response = {
                    'code': 404,
                    'msg': '用户名或密码错误',
                    'result': ''
                }
            return response
    
        @http.route(['/api/erp/productcenter/count'], type='http', auth='public', website=True, cors="*")
        def product_count(self):
         # 返回总数据量
            product_count = request.env['xxx.product.center.update.interface'].sudo().search_count([])
            response = {
                'code': 0,
                'result': product_count
            }
            return json.dumps(response)
        
  • 相关阅读:
    观察者模式(Observer)
    记负均正
    自守数
    等差数列
    字符统计
    Linux 第四次上机收获
    关于java的类加载(血泪史)
    vi常用操作与命令【持续更新中】
    P3-2017级算法第三次上机 B SkyLee逛漫展
    P3-2017级算法第三次上机 A 水水的二分查找
  • 原文地址:https://www.cnblogs.com/liangsha0/p/12146242.html
Copyright © 2020-2023  润新知