博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
odoo10参考系列--网络控制器(Web Controllers)
阅读量:3530 次
发布时间:2019-05-20

本文共 4174 字,大约阅读时间需要 13 分钟。

路由

odoo.http.route(route=None**kw)

标记装饰方法作为请求处理程序的装饰程序。该方法必须是Controller的一个子类的一部分。

参数

  • route -- 字符串或数组。路由部分将决定哪些HTTP请求将与装饰方法相匹配。可以是单个字符串或字符串数组。详见werkzeug的路由表达式格式的路由文档(  )
  • type -- 请求类型,可以是'http' 或 'json'.
  • auth --

    身份验证方法的类型,可以有以下内容:

    • user: 必须对用户进行身份验证,当前请求将使用用户的权限执行
    • public: 用户可以被验证,也可以不被验证。如果不是,当前请求将使用共享公共用户执行
    • none: 该方法始终是活动的,即使没有数据库。主要用于框架和验证模块。请求代码将没有任何访问数据库的设施,也没有任何配置指示当前数据库或当前用户
  • methods -- 此路由适用于一系列的HTTP方法。如果未指定,则允许使用所有方法
  • cors -- The Access-Control-Allow-Origin cors directive value.
  • csrf () --

    CSRF保护是否应该为路由启用

    默认值为 True. 详见 了解更多(如下)

CSRF Protection

版本9.0中的新内容。

Odoo实现了基于保护的令牌。

CSRF保护默认是启用的,适用于不安全的HTTP方法由定义(所有方法,除了GETHEADTRACE 和OPTIONS)。

CSRF保护是通过检查请求,其为一个值使用不安全的方法,该值称为csrf_token,其作为请求的表单数据的一部分。该值作为验证的一部分从表单中移除,而不必由您自己的表单处理来考虑。

为不安全的方法添加新控制器时(例如主要为表达使用POST):

  • 如果表达用Python生成,一个csrf 令牌可通过request.csrf_token() <odoo.http.WebRequest.csrf_token()获得, request 对象通过QWeb (python)模版中的默认模版获得, 它可能需要明确的添加如果你不使用 QWeb
  • 如果表单用Javascript生成,,CSRF令牌添加默认的QWeb (js)渲染上下文作为csrf_token,否则可以获得web.core模块csrf_token

    require('web.core').csrf_token
  • 如果端点可以被外部各方(不是Odoo)调用,例如REST API或webhook,CSRF保护必须在端点禁用。如果可能的话,你可能需要实现其他请求验证方法(确保它不被无关的第三方)

请求

请求对象在请求开始自动设置 odoo.http.request

class odoo.http.WebRequest(httprequest)

所有Odoo Web请求类型的父类,主要是处理请求的对象的初始化和设置 (调度本身必须由子类处)

参数

httprequest () -- 一个封装的werkzeug请求对象

httprequest

提供给请求的最初的  对象

params

请求参数的,通常不是有用的,因为它们直接作为关键字参数提供给处理程序方法

cr

Cursor 为当前方法调用初始化

当当前请求使用none身份验证时访问游标将引发异常

context

当前请求的上下文值

env

绑定到当前请求的Environment 

session

OpenERPSession 为当前HTTP会话保留HTTP会话数据

debug

指示当前请求是否处于“调试”模式

registry

连接到该请求的数据库的注册表。如果当前请求使用none身份验证,可以是None

推荐使用8.0以后的版本:使用 

db

与此请求相关联的数据库。 如果当前请求使用none身份验证,可以是None

csrf_token(time_limit=3600)

生成并返回当前会话的CSRF令牌

参数

time_limit (int | None) -- CSRF令牌应该只适用于指定的时间(以秒),默认情况下1h,令牌为None是有效的只要当前用户的会话是有效的

返回

ASCII 令牌字符串

class odoo.http.HttpRequest(*args)

用于http 请求类型的处理程序

匹配的路由参数、查询字符串参数、表单参数和文件作为关键字参数传递给处理程序方法。

在名称冲突的情况下,路由参数具有优先权。

处理程序方法的结果可以是:

  • 一个非法的值,在这种情况下,HTTP响应将HTTP 204(无内容)
  • 一个返回的werkzeug对象
  • 一个 str 或unicode,将被包装在响应对象中并被解释为HTML

make_response(dataheaders=Nonecookies=None)

用于非HTML响应的助手,或带有自定义响应头或cookie的html响应。

虽然处理程序只返回作为字符串发送的页面的HTML标记,如果返回非HTML数据,则需要创建一个完整的响应对象,否则返回的数据将不能被客户端正确地解释

参数

  • data () -- 响应体
  • headers ([(name, value)]) -- 在响应上设置的HTTP标头
  • cookies () -- 设置在客户端的cookie

not_found(description=None)

HTTP 404(未找到)响应的快捷方式

render(templateqcontext=Nonelazy=True**kw)

一个QWeb模版的懒渲染。

给定模板的实际呈现将在调度结束时发生。同时, 模板and/or qcontex参数可以通过静态响应更改或替换。

参数

  • template () -- 模板渲染
  • qcontext () --渲染上下文使用
  • lazy () -- 模板呈现是否应该推迟到最后一刻    
  • kw -- 发送到werkzeug的响应对象

class odoo.http.JsonRequest(*args)

HTTP上的对的请求处理

  • method 被忽略
  • params 必须是JSON对象(不是数组),并作为关键字参数传递给处理程序方法    
  • 处理方法的结果返回为JSON-RPC result 并且封装在中

成功的请求:

--> {"jsonrpc": "2.0",     "method": "call",     "params": {"context": {},                "arg1": "val1" },     "id": null}<-- {"jsonrpc": "2.0",     "result": { "res1": "val1" },     "id": null}

请求产生错误:

--> {"jsonrpc": "2.0",     "method": "call",     "params": {"context": {},                "arg1": "val1" },     "id": null}<-- {"jsonrpc": "2.0",     "error": {"code": 1,               "message": "End user error message.",               "data": {"code": "codestring",                        "debug": "traceback" } },     "id": null}

响应

class odoo.http.Response(*args**kw)

响应对象通过控制器路由链。

除了 参数之外,这类的构造函数可以采取下列附加的参数对QWeb进行懒渲染。

参数

  • template () -- 模板渲染
  • qcontext () -- 渲染上下文使用
  • uid () -- 用户id用于ir.ui.view渲染调用, None 用于请求的用户 (默认的)

这些属性可作为响应对象上的参数,并且可以在呈现之前随时更改

还公开了所有的属性和方法 

render()

呈现响应的模板,返回结果

flatten()

强制渲染响应的模版,设置结果作为响应体并不设置 template

控制器

控制器需要提供可扩展性,类似于,但不能使用与前置条件(带有加载模块的数据库)相同的机制(如没有创建数据库或没有数据库选择)。

因此,控制器提供了自己的扩展机制,与模型的扩展机制不同:

控制器是通过继承而创建的

class odoo.http.Controller

并使用定义装饰的方法:

class MyController(odoo.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()
  • 使用 装饰是必要的保持方法(和路由)可见:如果该方法未经修饰而重新定义,则将“未公开”
  • 所有方法的装饰相结合,如果重写方法的装饰没有参数,那所遇之前的装饰都将保留,任何提供的参数将覆盖以前定义的例如:

    class Restrict(MyController):    @route(auth='user')    def handler(self):        return super(Restrict, self).handler()

    将从对用户(需要登录)的公共身份验证改变/some_url 

 

ps:有翻译不当之处,欢迎留言指正。

原文地址:

转载地址:http://srwhj.baihongyu.com/

你可能感兴趣的文章
class的点点滴滴的总结
查看>>
vector 的点点滴滴的总结
查看>>
测试用例
查看>>
自动化测试学习步骤
查看>>
自动化测试需要掌握的知识
查看>>
HTTP协议
查看>>
Python问题总结01
查看>>
Python小程序——冒泡排序
查看>>
cmd中输入net start mysql 提示:服务名无效或者MySQL正在启动 MySQL无法启动
查看>>
LeetCode 206反转链表 [javsScript]
查看>>
[LeetCode javaScript] 3. 无重复字符的最长子串
查看>>
[LeetCode javaScript] 6. Z字形变换
查看>>
[LeetCode javaScript]455. 分发饼干
查看>>
[LeetCode javaScript] 735. 行星碰撞
查看>>
[LeetCode javaScript] 125. 验证回文串
查看>>
[LeetCode javaScript] 226. 翻转二叉树
查看>>
[LeetCode javaScript] 520. 检测大写字母
查看>>
[LeetCode javaScript] 350. 两个数组的交集 II
查看>>
[LeetCode javaScript] 53.最大子序和
查看>>
[LeetCode javaScript] 101. 对称二叉树
查看>>