-----------------
更新时间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,apiclass 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,0fruits.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)