odoo16--接口controller编写小白教程--01

本人程序猿小白,写csdn文章记录开发笔记,本篇跟大家分享一些odoo接口的编写方法,主要使用python语言,基于 odoo16 框架进行研发。如果有任何不正确的地方,欢迎各位大神指正!!

接口API简要介绍

应用程序接口(API),用来连接前端与后端的。

对前后端做一个简要的说明:
前端指的是用户在浏览器上看到和交互的部分,也就是网页的界面。
后端指的是控制 Web 应用程序逻辑的那部分代码,这部分代码通常运行在服务器上并处理数据存储、逻辑处理和交互等方面。
而接口主要是有四种类型:增、删、改、查

举个栗子:
一个微信小程序,用户所看到的页面就是前端页面,所点击的按钮,触发的任何动作(例如点击查询用户的个人信息–页面将会进行跳转并展示用户的个人信息)。那么这些个人信息的数据从哪里来呢,数据存储于服务器中。前端通过用户的需求,将服务器数据库中的数据调取出来渲染到前端页面进行展示。而后端则需要通过前端用户的需求,定制可实现具体功能的接口。

为模块创建一个接口文件

依旧是 举个栗子:
我们创建一个流浪猫管理的后台服务(这里可以参照另一位博主的文odoo新手创建模块

  • 我们在模块下创建一个controller目录,与models同级,controller文件夹下创建一个 init.py 文件,一个 main.py 文件

  • init.py 文件中引入main:

from . import main
  • 在main文件中编写接口
# -*- coding: utf-8 -*-
#这里都是导入的模块,其中有部分模块不需要,我就都搬上来了
import babel.messages.pofile
import base64
import datetime
import functools
import glob
import hashlib
import imghdr
import io
import itertools
import jinja2
import json
import logging
import operator
import os
import re
import sys
import tempfile
import time
import zlib
import copy
import werkzeug
import werkzeug.utils
import werkzeug.wrappers
import werkzeug.wsgi
from collections import OrderedDict
from werkzeug.urls import url_decode, iri_to_uri
from xml.etree import ElementTree
import unicodedata
from io import StringIO
import base64
import json

import odoo
import odoo.modules.registry
from odoo.api import call_kw, Environment
from odoo.modules import get_resource_path
from odoo.modules import get_module_resource
from odoo.tools.translate import _
from odoo.tools.misc import str2bool, xlwt, file_open
from odoo.tools.safe_eval import safe_eval
from odoo import http
from odoo.http import content_disposition, dispatch_rpc, request, \
    serialize_exception as _serialize_exception, Response
from odoo.exceptions import AccessError, UserError
from odoo.models import check_method_name
from odoo.service import db
from passlib.hash import pbkdf2_sha512
import random
import string
import requests

#logging 模块是一个用于记录日志的标准库。在开发中,我们通常会使用 logging 模块来记录程序的运行状态,便于后续调试和错误处理。
#获取当前模块的 logger 对象,便于在接口中记录日志信息。
_logger = logging.getLogger(__name__)

#从这里开始就是odoo框架定义的接口类
class AllData(http.Controller):

在接口文件中实现增、删、改、查操作

目标:前端查看当前所有猫猫的简要信息

#定义一个AllData控制器类,继承自 http.Controller 的自定义控制器类
class AllData(http.Controller):
    
    # 此接口用途:获取所有猫猫的简要数据
    
    # 其中/getAllCatData是访问端点的URL路径(自定义)。与定义的函数名需一致。
    # type='json' 指定端点所使用的Response类型。在这种情况下,该端点将返回JSON格式的数据。
    # auth="none" 指定访问该端点是否需要验证用户身份。在这种情况下,请求无需身份验证。
    # cors="*" 启用CORS(跨域资源共享)。在这种情况下,任何域都可以访问该端点。
    # 关闭CSRF保护,通常在Web API的情况下都需要关闭。
    @http.route('/getAllCatData', type='json', auth="none", cors="*", csrf=False)
    def getAllCatData(self, **kw):
     	#定位到模块名为'my.cats',并对他行使最高权限操作,sudo()即表示赋予其权限。将此模块的数据表赋值给cat_obj
        cat_obj = request.env['my.cats'].sudo()
      	#查找这张数据表,并将符合条件的数据放入cat_id。这里我们需要查询所有的数据表信息,即无查询条件。
        cat_id = cat_obj.search([])
        if not cat_id:           #判断若此模块中暂无数据表,则提示暂无数据
            return{
                "code":1,
                "data":"暂无猫猫数据"
            }
        result=[]				#定义一个result列表
        for cats in cat_id:      #循环判断查询出来的结果
            result.append({			#将查询出来的数据表中的某些字段以字典的形式放入result列表中,这里我们仅放入姓名、编码、年龄等字段。
                'name':cats.name,  #这里的关键字name是自定义的,说明你传给前端的数据叫什么,后面的数值cats.name表示查找数据表中的name字段存放数据。
                'code':cats.code,
                'age':cats.age,
                'cat_type':cats.cat_type,
                'price':cats.price
            })
        return{					#终止此函数并输出结果result列表
            "code":1,
            "data":result
        }
  • 在postman中测试此接口是否成功被调用
    在这里插入图片描述上图中传入最好用post,我这里用了get也是ok的

目标:前端查看某一只猫猫的详细信息

  • 后台如何知道前端用户需要哪一只猫猫的数据呢?odoo模块给我们的每张数据表都自动定义了一个id字段,相当于编号,id在每一个model中都是唯一的。
  • 例如:如果我需要在上述获取所有猫猫的数据同时,也获取每一只猫猫的id,则可以在接口代码中加入
	for cats in cat_id:
            result.append({    #上述代码已写,无需再添加
                'id':cats.id,  #本段代码仅新增一个id字段
                'name':cats.name, 
                ....
            })
  • 我们可以再次调用postman进行查看,是否有返回了id数据(注意每次变动了代码都需要重启一下odoo)

    这里我们可以看到每一只猫猫的id,此id为odoo自动编号,无需定义。

  • 我们还可以直接让id显示在odoo社区页面,在view试图的form标签中加入:

<form>
	<sheet>
		<group>
			<field name='id'></field>
			<field name='code'></field>
				...
		</group>
	</sheet>
<form>

在这里插入图片描述

  • 刷新后我们可以直接在odoo社区页面中看到每一只猫猫的id
    在这里插入图片描述
  • 现在我们前端已经从接口中获取到每一只猫猫的id,即唯一的编号,则可以获取某一只猫猫的详细信息
# 获取某一只猫猫的详细数据
    '''
    uid  猫猫id  这里注释说明需要前端传入的参数名字为uid
    '''
    @http.route('/getOneCatData', type='json', auth="none", cors="*", csrf=False)
    def getOneCatData(self, **kw):
        cat_obj = request.env['my.cats'].sudo()
        cat_id = cat_obj.search([('id','=',int(kw['uid']))]) #这里做查询判断,在所有数据表中找到猫猫id为前端传入的uid的那张数据表
        if not cat_id:  #如果没有,则找不到这只uid猫猫
            return{
                "code":1,
                "data":"暂无此猫猫数据"
            }
        return{		#返回给前端的数据
            "code":1,
            "data":{
                'id':cat_id.id,
                'name':cat_id.name,
                'code':cat_id.code,
                'age':cat_id.age,
                'cat_type':cat_id.cat_type,
                'price':cat_id.price,
                'borrowed':cat_id.borrowed,
                'cats_home':cat_id.cats_home,
                'personality_id':cat_id.personality_id,
                'description':cat_id.description
            }
        }
  • 在postman中修改访问路径与传入参数
    在这里插入图片描述
    到这里我们为止我们初步实现了查询功能,下一章节继续实现新增和删除功能
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值