zoukankan      html  css  js  c++  java
  • (10)odoo控制器操作

    -----------------
    更新时间
    11:17 2016-09-18 星期日    完善讲解
    17:44 2016-02-17 星期三
    -----------------
    * 控制器Controller
      它的功能是拦截浏览器的请求和响应数据的发送

    * 一个简单的控制器
       from openerp import http
       class Mymodule(http.Controller)
           @http.route('mymodule/mymodule/', auth='public')
           def index(self,**kw)
               return "Hello, world"
               #return http.request.render("mymodule.index",{'fruits':['apple','banana','pear']})
               使用模板
               "mymodule.index":指mymodule模块下的标识为index的模板
               {'fruits':['apple','banana','pear']}: 带一个字典数据给模板

              
       对应的模板文件
        <openerp>
            <data>
               <template id="index">  <!--定义了标识为index 的模板-->
                    <title>mymodule</title>
                    <t t-foreach="fruits" t-as="fruit"> <!--对带过的数据进行遍历-->
                        <p><t t-esc="fruit"></p>
                    </t>
               </template>
            </data>
        </openerp>   

    * 数据模型
      在开始安装模块时,会预定义一些数据
      如模型定义如下:
      from openerp import models,fields,api

      class  Fruits(models.Model):
          _name = 'mymodule.fruits'
          name = fields.Char()

      manifest定义(__openerp__.py)如下:
      'data':[
            'security/ir.model.access.csv',
            'fruits.xml'
      ],

      security/ir.model.access.csv 内容如下:
      id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
      access_mymodule_fruits,access.mymodule.fruits,model__mymodule_fruits,,1,0,0,0

      fruits.xml 内容如下:
      <openerp>
        <data>
            <record id="apple" model="mymodule.fruits">
                <field name="name">apple</field>
            </record>
            <record id="'banana" model="mymodule.fruits">
                <field name="name">'banana</field>
            </record>
            <record id="pear" model="mymodule.fruits">
                <field name="name">pear</field>
            </record>
        </data>
       </openerp>

    * 控制器得到数据模型定义的数据
       from openerp import http
       class Mymodule(http.Controller)
           @http.route('mymodule/mymodule/', auth='public')
           def index(self,**kw)
               Fruits = http.request.env['mymodule.fruits'] #得到 mymodule.fruits 模型

               return http.request.render("mymodule.index",{
                          'fruits':Fruits.search([])  #  search([]) 全部搜索出来
                  })


       
    * 路由 (URL Patterns)
        # 带参数   
        @http.route('hello/<name>') 
        def hello(self,name, **kw){
           return "Hello,{}".format(name)   
        }
       
        #指定参数是整数
        @http.route('hello/<int:identifier>') 
        def hello(self,identifier, **kw){
           return "Hello,{}".format(identifier)   
        }
       
        #指定参数是长度为5的字符串
        @http.route('hello/<string(length=5):lang>') 
        def hello(self,lang, **kw){
           return "Hello,{}".format(lang)   
        }
       
        #指定参数是指定字符串数组之一
        @http.route('hello/<any(bird,reptil,mammal):group>/<int:id>/') 
        def hello(self,group,,id, **kw){
           return "Hello,{}".format(group,id)   
        }
           
            * string(minlength=1,maxlength=None,length=None)
            * path
            * any(*items)
            * int([fixed_digits][,min][,max])
            * float([min],[,max])
            * uuid(Werkzeug0.10)
            * model(model_name)
           
        #多重路径匹配
        @http.route(['/hello/','/hello/<int:value>']) 
        def hello(self,value, **kw){
           return "Hello,{}".format(value)   
        }    
       
        #网站支持
        @http.route('/hello/', website=True)
        def hello(self, **kw):
            return http.request.render('module.hello')
        --------
        http.request.website
        http.request.lang  得到语言
        http.request.redirect(url) 跳转
           
    * 验证
        #公用,不要验证可以访问
         @http.route('/hello/','public') 
          def hello(self, **kw){
           # code   
        }

        #要登录才能访问,否则跳到登录页面
         @http.route('/hello/','user') 
          def hello(self, **kw){
           # code   
        }
       
        #request.uid=none
         @http.route('/hello/','none') 
          def hello(self, **kw){
           # code   
         }
        
        # 采用 GET 模式访问
         @http.route('/hello/', methods=['GET']) 
          def hello(self, **kw){
           # code   
         }
        
         # 采用 POST 模式访问
         @http.route('/hello/', methods=['POST']) 
          def hello(self, **kw){
           # code   
         }
       
       
    * 请求
        class openerp.http.WebRequest(httprequest)
        封装的属性
            httprequest: werkzeug.wrappers.Request 原始的request
            params:映射的参数
            env: 当前环境
            context:上下文
            session: 会话
            cr: 数据库操作句柄
            debug:当前是否调试模式
            db:当前连接的数据库
           
        class openerp.http.HttpRequest(*args)
                make_response(data, headers=None, cookies=None)
                not_found(description=None) 404页面的响应
                render(template, qcontext=None, lazy=True, **kw) 带上模板渲染
               
        class openerp.http.JsonRequest(*args)
        返回json   
       
    * 响应
        class openerp.http.Response(*args, **kw)
            *args 为
                template (basestring) -- 指定的模板名
                qcontext (dict) -- 渲染的上下文
                uid (int) -- 渲染到模板上的用户id
               
        可用的方法
            render() 渲染指定模板
            flatten() 强制渲染,没有采用模板
               
       
    * 控制器
        class openerp.http.Controller
       
        class MyController(openerp.http.Controller):
        @route('/some_url', auth='public')
        def handler(self):
            return stuff()
           
        覆盖:
        class Extension(MyController):
        @route()
        def handler(self):
            do_before()
            return super(Extension, self).handler()
           
    *代码分析
        大部分操作用openerp/http.py中的方法
       
        class Home(http.Controller):

        #首页 跳转到/web
        @http.route('/', type='http', auth="none")
        def index(self, s_action=None, db=None, **kw):
            return http.local_redirect('/web', query=request.params, keep_hash=True)
        ....
        # 跳转
              def local_redirect(path, query=None, keep_hash=False, forward_debug=True, code=303):
              这是http.py中的,封装了 werkzeug的跳转
              def redirect(location, code=302) 这个是werkzeug中的
        #得到模型
              request.registry['模型名']
              menu_data = request.registry['ir.ui.menu'].load_menus(request.cr, request.uid, context=request.context)   

  • 相关阅读:
    HDU4628+状态压缩DP
    Javascript 去掉字符串前后空格的五种方法
    Javascript 数组之判断取值和数组取值
    ASP.NET MVC 出现错误 “The view 'XXX' or its master was not found or no view engine support”
    ASP.NET MVC 页面调整并传递参数
    ASP.NET MV3 部署网站 报"Could not load file or assembly ' System.Web.Helpers “ 错的解决方法
    ASP.NET MVC 控制器向View传值的三种方法
    CSharp 如何通过拼接XML调用存储过程来查询数据
    SQLServer : EXEC和sp_executesql的区别
    关于SQLServer2005的学习笔记—异常捕获及处理
  • 原文地址:https://www.cnblogs.com/toby2chen/p/5177110.html
Copyright © 2011-2022 走看看