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)   

  • 相关阅读:
    springnodejs
    js CacheQueue
    权重练习
    架构师速成8.3-可用性之分库分表
    架构师速成8.3-可用性之分布式
    架构师速成8.3-可用性
    架构师速成8.3-架构师必须要了解的规则(转)
    架构师速成6.15-开发框架-单点登录
    架构师速成6.14-开发框架-异常处理
    架构师速成6.13-开发框架-前后结合
  • 原文地址:https://www.cnblogs.com/toby2chen/p/5177110.html
Copyright © 2011-2022 走看看