翼度科技»论坛 编程开发 python 查看内容

odoo Web Controllers 学习总结

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
环境

odoo-14.0.post20221212.tar
Web Controllers

Controllers

控制器需要提供可扩展性,就像Model,但不能使用相同的机制,因为先决条件(已加载模块的数据库)可能还不可用(例如,未创建数据库或未选择数据库)。
因此,控制器提供了自己的与模型的扩展机制:
通过继承Controller创建控制器。通过 route()修饰的方法定义路由:
  1. class MyController(odoo.http.Controller):
  2.     @route('/some_url', auth='public')
  3.     def handler(self):
  4.         return stuff()
复制代码
要重写控制器,继承其类并重写相关方法,必要的话,重新暴露它们。
  1. class Extension(MyController):
  2.     @route()
  3.     def handler(self):
  4.         do_before()
  5.         return super(Extension, self).handler()
复制代码

  • route() 修饰是保持方法(和路由)可见的必要条件:如果方法在没有修饰的情况下被重新定义,它将是“未发布的”
  • 所有方法的修饰符都是组合的,如果没使用任何参数重写方法修饰符,之前所有的参数都被保留,任何提供的参数都将覆盖之前定义的参数,比如:
    1. class Restrict(MyController):
    2.     @route(auth='user')
    3.     def handler(self):
    4.         return super(Restrict, self).handler()
    复制代码
    将/some_url从公共身份验证更改为用户身份验证(需要登录)
一个简单示例

代码组织结构如下:

odoo14\custom\estate\controllers\controller.py
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from odoo import http
  4. import json
  5. class TestApi(http.Controller):
  6.     @http.route('/test-api-service/testService/testReq', type='http',
  7.                 auth="public", methods=['POST'], csrf=False, cors='*')
  8.     def test_api(self, **kwargs):
  9.         try:
  10.             print(kwargs)
  11.             return json.dumps({'code': 200, 'msg': '请求成功'}, ensure_ascii=False)
  12.         except Exception as e:
  13.             return json.dumps({'code': 500, 'msg': '%s' % e}, ensure_ascii=False)
复制代码
注意:不能直接返回json字典,bool值等,会提示不可返回不可调用对象,但是可直接返回字符串,或者返回字符串的函数,如下:
  1. class TestApi(http.Controller):
  2.     @http.route('/test-api-service/testService/testReq', type='http',
  3.                 auth="public", methods=['POST'], csrf=False, cors='*')
  4.     def test_api(self, **kwargs):
  5.         try:
  6.             return self.get_result()
  7.         except Exception as e:
  8.             return json.dumps({'code': 500, 'msg': '%s' % e}, ensure_ascii=False)
  9.     def get_result(self, *args):
  10.         return '请求成功'
复制代码
odoo14\custom\estate\controllers\__init__.py
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from . import controller
复制代码
odoo14\custom\estate\__init__.py
  1. from . import models
  2. from . import controllers
复制代码
验证

服务端控制台输出请求参数:
  1. {'arg1': 'value1', 'arg2': 'value2'}
复制代码
API

Routing

odoo.http.route(route=None, **kw)[源代码]

修饰器将被修饰的方法标记为请求的处理程序。该方法必须是Controller子类的一部分
参数:

  • route – 字符或者数组。将确定哪些http请求将匹配被修饰方法的路由部分。可以是单个字符串或字符串数组。有关路由表达式的格式,请参见werkzeug的路由文档(http://werkzeug.pocoo.org/docs/routing/ )。
  • type – 请求类型,可选值: 'http'  、'json'
  • auth
    身份验证方法的类型,可以是以下类型之一:

    • user: 用户必须经过身份验证,执行当前请求的用户,必须具有对应的执行权限
    • public: 用户可能已经过身份验证,也可能没有经过身份证验证。如果没经过身份验证,使用共享公共用户(Public user)执行当前请求。
    • none: 即使没有数据库,该方法也始终处于活动状态。主要由框架和认证模块使用。请求代码没有任何访问数据库的设施,也没有任何指示当前数据库或当前用户的配置。

  • methods – 此路由所应用的一系列http方法。如果未指定,则允许使用所有方法。
  • cors –  Access-Control-Allow-Origin cors 指令值
  • csrf (bool) –
    是否为该路由开启CSRF 保护。
    默认为 True。查看CSRF Protection 获取更多信息。
参考连接

https://www.odoo.com/documentation/14.0/zh_CN/developer/reference/addons/http.html

来源:https://www.cnblogs.com/shouke/p/17135915.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具