在controllers层添加urls,可以自定义返回数据格式,json,字符串,html页面、重定向url等

点我下载完整odoo的demo

对内api

内部访问,只能内部通过rpc来访问

import json
from odoo import http, fields
from odoo.http import requestclass GetPartner(http.Controller):@http.route('/api/partner', auth='user')def partner(self, **kw):keywords = kw.get('keywords') or ''domain = [('company_id', 'in', [1, request.env.user.company_id.id]),('customer', '=', True)]if keywords:domain += [('name', 'ilike', keywords)]partner = request.env['res.partner'].with_context({'search_default_customer': 1}).search(domain, limit=80)partners = []for res in partner:partners.append({'id': res.id,'text': res.name,})return json.dumps(partners)

比如js中使用rpc访问:

// select2控件加载客户数据
$('#partner_ids').select2({multiple: true,ajax: {url: '/api/partner',contentType: "application/json; charset=utf-8",dataType: 'json',data: function (str) {return {keywords: str}},results: function (data) {return {results: data};},cache: true}
});

外部api

外部访问需要加dmz前缀:

# -*- coding: utf-8 -*-
import json
import jinja2
import werkzeug
import sys
import os
import loggingfrom odoo import http
from odoo.http import request, JsonRequest, Response
from odoo.tools import ustr, date_utilsif hasattr(sys, 'frozen'):# 加载html目录,使用jinja2渲染模板path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'views'))loader = jinja2.FileSystemLoader(path)
else:loader = jinja2.PackageLoader('odoo.addons.my_first_app', 'views')env = jinja2.Environment(loader=loader, autoescape=True)
env.filters['json'] = json.dumps
_logger = logging.getLogger(__name__)def _json_response(self, result=None, error=None):# 自定义odoo接口返回数据格式,获取到参数my_json就直接返回json数据,否则就返回默认数据格式# 默认数据格式'''{'jsonrpc': '2.0','id': 12,'data': {}}'''if self.endpoint and self.endpoint.routing.get('my_json'):response = {}if error is not None:response['error'] = errorif result is not None:response = resultelse:# odoo返回的默认数据格式response = {'jsonrpc': '2.0','id': self.jsonrequest.get('id')}if error is not None:response['error'] = errorif result is not None:response['result'] = resultmime = 'application/json'body = json.dumps(response, default=date_utils.json_default)return Response(body, status=error and error.pop('http_status', 200) or 200,headers=[('Content-Type', mime), ('Content-Length', len(body))])# 重写JsonRequest中的_json_response方法
setattr(JsonRequest, '_json_response', _json_response)class MyAPI(http.Controller):# 对外apidef valid_response(self, data, message='', fmt='json'):# 返回json数据if fmt == 'str':return werkzeug.wrappers.Response(response=message)res = {'error': 0, 'message': message}res['data'] = datareturn werkzeug.wrappers.Response(content_type="application/json; charset=utf-8",response=json.dumps(res),)def invalid_response(self, message, error=1, fmt='json'):# 返回错误提示if fmt == 'str':return werkzeug.wrappers.Response(response=message)res = {'error': error, 'message': ''}res['message'] = messagereturn werkzeug.wrappers.Response(content_type="application/json; charset=utf-8",response=json.dumps(res),)def invalid_response_template(self, message):# 返回错误页面return env.get_template('error.html').render({'message': message})def get_base_url(self):# 可以在系统参数中定义一个主urlreturn request.env['ir.config_parameter'].sudo().get_param('web.url')@http.route('/dmz/hello_world', type='http', auth='public', website=True, sitemap=False)def helloworld(self, *args, **kw):# 返回格式1:返回jinjia2渲染的页面# return self.invalid_response_template('参数有误')# 返回格式2:重定向urlurl = '/dmz/redirect_url'return werkzeug.utils.redirect(url)# 返回格式3: json格式# data = {'python': 'hello world'}# return self.valid_response(data)@http.route('/dmz/redirect_url', type='http', auth='public',csrf=False)def redirect_url(self, *args, **kw):return {'code': 200, 'msg': '111'}@http.route('/dmz/defaultjson', type='json', auth='public', methods=['POST'], csrf=False)def default_json(self, *args, **kw):# 返回odoo默认的Json格式数据return {'code': 200, 'msg': '默认json格式'}@http.route('/dmz/newjson', type='json', auth='public', methods=['POST'], csrf=False, my_json=True)def new_json(self, *args, **kw):# 返回自定义的Json格式数据return {'code': 200, 'msg': '自定义json格式'}

在浏览器上输入127.0.0.1:8069/dmz/hello_world即可获取数据。

type='http’表示返回字符串

type='json’表示返回json

测试:

import jsonimport requests
header = {'Content-Type': 'application/json'}
# odoo默认格式
url='http://127.0.0.1:8199/dmz/defaultjson'
response = requests.post(url,  data=json.dumps({'code':200}), headers=header)
print('odoo默认格式 ', response.content.decode('utf-8'))# 自定义返回的json格式
url='http://127.0.0.1:8199/dmz/newjson'
new_response = requests.post(url,  data=json.dumps({'code':200}), headers=header)
print('自定义返回的json格式', new_response.content.decode('utf-8'))

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

odoo的api接口相关推荐

  1. odoo16外部api接口

    参考了odoo的api接口_东木月的博客-CSDN博客_odoo 接口 他的方法只适用于低版本odoo,新版本odoo路由层大改已经失效了,我个人花了点精力折腾了新版本的用法,勉强能用 #!/usr/ ...

  2. java跨域权重_爱站权重查询 API 接口请求调用

    原标题:爱站权重查询 API 接口请求调用 爱站权重查询 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以GET/POST方式提交即可.爱站权重查询 API 接口可以 ...

  3. 使用Node.js写一个简单的api接口

    引入Http模块 默认你已经安装了Node.js Node当中内置了Http模块: 可以使用 var http= require("http"); 复制代码 引入http模块: H ...

  4. Swagger 生成 PHP restful API 接口文档

    需求和背景 需求: 为客户端同事写接口文档的各位后端同学,已经在各种场合回忆了使用自动化文档工具前手写文档的血泪史. 我的故事却又不同,因为首先来说,我在公司是 Android 组负责人,属于上述血泪 ...

  5. shell脚本api接口考虑并发问题的可行性操作

    当我们通过收集每台客户端数据后通过api接口上传到云服务器时,可能会由于客户端过多,几千以至于几万,这时不得不考虑个问题: 并发的问题,同时并发上传文件,可能导致api接口挂掉,但如果我们让文件错开时 ...

  6. js学习总结----crm客户管理系统之项目开发流程和api接口文档

    CRM ->客户管理系统 CMS ->内容发布管理系统 ERP ->企业战略信息管理系统 OA -> 企业办公管理系统 产品 / UI设计:需求分析,产品定位,市场调查...按 ...

  7. 看看人家那后端API接口写得,那叫一个优雅!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/tEvn 在移动互联网,分布式.微服务 ...

  8. 拒绝接口裸奔!开放API接口签名验证!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/kChH 接口安全问题 请求身份是否合 ...

  9. Java 如何设计 API 接口,实现统一格式返回?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:老顾聊技术 前言 接口交互 返回格式 控制层Controll ...

最新文章

  1. 不可不知的软件架构模式
  2. 机器学习模型调优总结!
  3. Linux SWAP分区占用率高,刷新SWAP分区方法
  4. Boost:双图bimap的修改和替换测试程序
  5. springmvc中获取request对象,加载biz(service)的方法
  6. php二维数组json,php如何将二维数组转为json数据
  7. [ASP,VB] - 利用ASP调用API COM接口实现开关机
  8. Dlib与OpenCV图片转换
  9. 网络技巧:想要WiFi信号满格,路由器应该这样放!
  10. r语言转化为python_数值型与字符型转换总结|R语言
  11. Hive 外部表关联分区数据
  12. 【debug】python打包成exe,太大了该怎么解决?
  13. mysql中关于group的语句指令_mysql不支持group by的解决方法小结
  14. 运维测试工作笔记0003---使用Jmeter测试_http接口_高并发测试
  15. 如何在正则表达式中使用变量?
  16. enlightenment提权的工具
  17. Python中如何求分数化简
  18. 蓝牙防丢器原理和作用
  19. linux zip分卷压缩解压命令
  20. 计算机网络口诀,网线水晶头接法顺序图解分享,这个简单口诀记好了(超实用)...

热门文章

  1. 【翻译】Deep Anatomical Context Feature Learning for Cephalometric Landmark Detection
  2. 华为云CCI方式部署服务
  3. reactos操作系统实现 3
  4. C/C++八大排序(c/c++)
  5. python出现invalid argument什么意思_python程序运行后提示IOError: [Errno 22] Invalid argument 急啊!!!!...
  6. DAO杂谈:从Sushi到EOS,从People再到红杉
  7. 在线转换glb格式模型gltf格式模型fbx格式模型obj模型转换
  8. 【Android Gradle 插件】PackagingOptions 配置 ④ ( pickFirsts、merges、excludes 属性配置 Set<String> 类型属性值常用配置方法 )
  9. 装好office之后,鼠标右键不显示word和excel的问题
  10. chkdsk工具使用总结