odoo17后台启动过程4——odoo.http.root

在上一篇文章中,我们再启动server的时候传入了一个对象odoo.http.root,看看这是何方神圣
odoo\http.py
在这里插入图片描述
这里定义了Application类, 二root是这个类的一个实例,注释说这是WSGI网关的入口点。通过调试跟踪,也确定了
odoo web请求最终都会发送给这个类去处理。

这个类实现了__call__函数,所以这个类可以当做函数去调用的。

def __call__(self, environ, start_response):"""WSGI application entry point.:param dict environ: container for CGI environment variablessuch as the request HTTP headers, the source IP address andthe body as an io file.:param callable start_response: function provided by the WSGIserver that this application must call in order to send theHTTP response status line and the response headers."""

看注释:
WSGI 应用的入口点:
environ 环境对象,一个字典,包括了HTTP请求头,IP地址以及body等信息
start_response: WSGI网关提供的回调函数,app处理完之后,需要调用这个函数返回响应信息。

这个函数根据将传入的environ封装成了httprequest对象,然后又将httprequest对象封装成了Request对象
最后根据不同的场景,生成了不同的response对象,然后返回 response(environ, start_response)。
三种场景:
一种是静态文件
需要DB
不需要DB

        try:if self.get_static_file(httprequest.path):response = request._serve_static()elif request.db:with request._get_profiler_context_manager():response = request._serve_db()else:response = request._serve_nodb()return response(environ, start_response)

我们来看看比较常见的_serve_db()是什么逻辑?
这是request对象的一个方法,作用是在转发给 _serve_ir_http之前准备好session并且加载ORM。
看看_serve_ir_http, 委托了对ir.http模型的大部分处理过程,这些都是对app的扩展。

    def _serve_ir_http(self):"""Delegate most of the processing to the ir.http model that isextensible by applications."""ir_http = self.registry['ir.http']try:rule, args = ir_http._match(self.httprequest.path)except NotFound:self.params = self.get_http_params()response = ir_http._serve_fallback()if response:self.dispatcher.post_dispatch(response)return responseraiseself._set_request_dispatcher(rule)ir_http._authenticate(rule.endpoint)ir_http._pre_dispatch(rule, args)response = self.dispatcher.dispatch(rule.endpoint, args)# the registry can have been reniewed by dispatchself.registry['ir.http']._post_dispatch(response)return response

这个函数里已经可以调用orm了,ir_http = self.registry[‘ir.http’]这种写法也是一种常见的写法,获得对某一个模型的引用。
这个函数做了两件事:
1、根据请求路径获取到对应的路由规则 和 请求参数

 rule, args = ir_http._match(self.httprequest.path)

2、请请求转发给路由规则中的处理函数,并将请求参数args也传递过去。

 response = self.dispatcher.dispatch(rule.endpoint, args)

这篇文章到这里结束了,下一篇文章将解析一下 ir.http模型,看看它的_match方法都做了啥。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/315541.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程池的两种提交方式

线程池是一种并发编程的机制,用于管理和重用线程,以提高应用程序的性能和效率。Java中的ExecutorService是线程池的一个接口,它提供了两种主要的方法来提交任务:execute()和submit()。 1. execute() 方法: void execut…

IP tables防火墙(一)

本章主要介绍: 熟悉Linux防火墙的表,链的结构理解数据包匹配的基本流程学会编写IP tables规则 1.0防火墙基础 在 Internet 中,企业通过架设各种应用系统来为用户提供各种网络服务,如 Web 网站、电子邮件系统、FTP 服务器、数…

教你用策略枚举消除if-else判断(以支付场景为例子)带给你新的认知,记得收藏哦~

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

TDD-LTE 附着流程和去附着流程

目录 1. 附着流程 1.1. 正常附着流程 2. 异常附着流程 2.1 RRC建立失败 2.2 核心网拒绝 2.3 eNodeB未收到初始化上下文建立请求 2.4 RRC重配置请求丢失 2. 去附着流程 2.1 非关机去附着流程 2.1.1 连接态非关机去附着 2.1.2 空闲态非关机去附着 2.2 关机去附着流程 …

【algorithm】自动驾驶常见常考的几个模型和推导,顺便总结自己遇到的考题经验不断更新之———控制版

写在前面 本来快达成目标了,没想到公司遭受了问题,公司和同事我感觉还是挺好的,有国企的正规也有小企业的灵活,大家都很有学习欲望。 作为本次再次复习回忆如下: 把之前面试准备的 机器学习(基本搬运到CSD…

车载 Android之 核心服务 - CarPropertyService 的VehicleHAL

前言: 本文是车载Android之核心服务-CarPropertyService的第二篇,了解一下CarPropertyService的VehicleHAL, 第一篇在车载 Android之 核心服务 - CarPropertyService 解析-CSDN博客,有兴趣的 朋友可以去看下。 本节介绍 AndroidAutomotiveOS中对于 Veh…

什么是软件测试?这是我听过最通俗易懂的解释

很多人总是说我要学习软件测试,因为他可以拿到一个不错的薪资。 但是当我问他你知道什么是软件测试吗?这个时候,他总会愣住了,一脸不屑的表情说着,不就是找bug,给软件找问题,找茬吗&#xff1f…

混合编程—C++程序中python脚本的嵌入方法(理论部分)

一、C与Python高级编程语言简概 (一)C C是一种被广泛使用的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程范式,例如过程化程序设计(Procedural programming)、面向对象程序设计(…

CISSP 第1章:实现安全治理的原则和策略

作者:nothinghappend 链接:https://zhuanlan.zhihu.com/p/669881930 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 CIA CIA 三性: 机密性:和数据泄露有关。完整性…

odoo17 | 模型和基本字段

前言 在上一章的最后,我们能够创建一个Odoo模块。然而,在这一点上,它仍然是一个空壳,不允许我们这样做 存储任何数据。在我们的房地产模块中,我们希望存储与 数据库中的属性(名称、描述、价格、居住面积等…

【BIG_FG_CSDN】C++ 数组与指针 (个人向——学习笔记)

一维数组 在内存占用连续存储单元的相同类型数据序列的存储。 数组是静态存储器的块;在编译时确定大小后才能使用; 其声明格式如下: 元素类型 数组名[常量];元素类型:数组中元素的数据类型; 常量&#…

Python 自学(二) 之流程控制语句

目录 1. if ... elif ... else 语句 P62 1. if ... elif ... else 语句 P62 每个判断语句后面要加 :elif 的写法比较特别