odoo缺点,odoo教程
转载自https://blog.csdn.net/kami DOX/文章/详情/39756299
blog.csdn.net/perfect悲伤街3359号/文章/详情/80237066
基础知识:
Werkzeug简介Werkzeug官网的描述是什么?
werkzeugisawsgiutitylibraryforpython .它是经过许可的。泽尔克泽格
还有什么是WSGI?WGI的全称是web服务器网关接口,是一个用来定义Web服务器接口的规范。简单来说,就是定义http服务应该如何成长,可以处理哪些事情。PEP333是本规范的详细说明。
Werkzeug是一个使用python实现WSGI的通用库。这是Flask使用的基本WSGI库。
Werkzeug的源代码托管在GitHub上,目前开发非常活跃。
用于实现请求和响应对象的基于JavaScript脚本语言的交互式浏览器调试器,100%兼容WSGI 1.0规范,很容易分析Werkzeug中包含的内容。HTTP头2.7和3.3Unicode支持HTTP会话和签名Cookie,以及URI和IRI处理功能。Unicode支持内置的非标准WSGI服务器和浏览器的兼容性。Werkzeug的创造者是高产程序员阿明罗纳彻。从Werkzeug到Flask,再到Jinja2,几乎所有人都是圆的。那个博客也经常分享有价值的文章,对Python编程感兴趣的人可以看看。
我看过Werkzeug和Flask对源代码的评论:
mostpythoniccodeandwriteforhumanbeing
Werkzeug详细信息
首先介绍一下werkzeug是什么。Werkzeug是Web框架的基本WSGI工具包。这里稍微解释一下,werkzeug既不是web服务器,也不是web框架,而是一个工具包。根据官方介绍,它是一个WSGI工具包,可以作为web框架的基础库。因为它封装了很多web框架比如请求和响应。
比如我最常用的Flask框架就是基于Werkzeug开发的。因此,分析Werkzeug的基础。因为我想知道Flask的实现逻辑和基本控制。虽然Flask在本文中没有涉及,但是我们已经使用Werkzeug创建了一个简单的web APP演示,并以这个web APP演示为例分析了请求处理和响应生成的过程。
让我们从一个简单的例子开始。我们先来看看werkzeug的用法,再来探究werkzeug的实现原理。
安装werkzeug,希望读者在virtualenv环境下跟随我的脚步。如果你还不知道什么是virtualenv,请在我的博客上搜索virtualenv,并在继续之前修复它。因为数据库冲突等问题,很有可能看不到本文介绍的内容。
好,那就开始安装werkzeug。
一个
pip安装Werkzeug
如果这个命令继续,几秒钟后就可以使用werkzeug了。
在一个简单的web服务器之后,我们开始使用werkzeug创建一个简单的web服务器。这个服务器只返回‘Hello Werkzeug’,没有别的。
一个
2
三
四
五
六
七
八
九
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/wldcjl/env python
#编码:utf-8
导入操作系统
fromwerkzeug . servingimportrun _ simple
fromwerkzeug . wrappersimportrequest,Response
fromwerkzeug . wsgiimportshareddatamiddleware
p
不久类(对象):
def dispatch_request(自身,请求):
返回响应(“你好,Werkzeug!”)
def wsgi_app(self,environ,start_response):
请求=请求(环境)
response=self.dispatch_request(请求)
返回响应(environ,start_response)
def __call__(self,environ,start_response):
return self.wsgi_app(environ,start_response)
def create_app(with_static=True):
app=Shortly()
if with_static:
app . wsgi _ app=SharedDataMiddleware(app . wsgi _ app,{
/static :OS . path . join(OS . path . dirname(_ _ file _ _), static )
})
返回应用程序
if __name__==__main__ :
app=create_app()
run_simple(127.0.0.1 ,6666,app,use_debugger=True,use_reloader=True)
这段代码实现了我说的功能,那么我们来看看这段代码是如何工作的。
首先,一切都要回到最初。从main开始可以发现main非常简单,只有一个初始化函数,然后调用werkzeug的run_simple函数。好的,我们可以发现这个应用实际上是一个Shortly对象。这个类只实现了三个方法,一个是dispatch _ request,WSIG _ app,call。就这么简单。然后我们知道关键代码不是这些,应该是run_simple。
Run_simple Parses好了,我们博客系列的目的是解析werkzeug源代码,所以获取werkzeug源代码肯定是我们要做的事情。所以第一步,我们需要克隆werkzeug克隆github:
一个
git克隆https://github.com/mitsuhiko/werkzeug.git
然后,我们来寻找run_simple的代码。
一个
vim werkzeug/serving.py
转到559行
我们可以看到这个函数的定义。秉承关注重点的原则,我们会忽略条件判断,用最简单的方式看代码。假设是这样的:
一个
2
三
use _调试器=False
静态文件=假
use_reloader=False
好了,那么这里,其实run_simple调用的是内部,那么我们来看看内部代码:
一个
2
三
四
五
六
七
八
九
10
11
646:尝试:
647:FD=int(OS . environ[ WERKZEUG _ SERVER _ FD ])
648: except (LookupError,ValueError):
649: fd=无
650: srv=make_server(主机名,端口,应用程序,线程,
651:进程,请求处理程序,
652:直通错误,ssl上下文,
653: fd=fd)
654:如果fd为无:
655: log_startup(srv .套接字)
656: srv.serve_forever()
忽略fd,那么还剩下一点点:
一个
2
三
四
五
六
650: srv=make_server(主机名,端口,应用程序,线程,
651:进程,请求处理程序,
652:直通错误,ssl上下文,
653: fd=fd)
656: srv.serve_forever()
好了,你应该和我一样有兴趣知道这个make_server里面有什么,我也很期待,那就跟进看看吧。
make_server的代码我就不贴了。还是最简单的原理,忽略各种条件,所以假设如下:
一个
2
线程=假
流程=1
然后代码也很简单,留下:
一个
2
546:返回BaseWSGIServer(主机,端口,app,request_handler,
547:直通错误,ssl上下文,fd=fd)
很好,这个很难追查,最后关键是这个BaseWSGIServer。我们来看看这个类实现了哪些功能。
先看看这个类的定义:
一个
443:class BaseWSGIServer(http server,object):
这个类继承自HTTPServer,所以我们在底部。这就差不多结束了,我们已经见过Python的API了。好了,既然是继承自HTTPServer,那就当是HTTPServer吧,然后继续看run_simple的代码。我们一路跟踪,发现656行中有一个srv.serve_forever(),那么这不就是HTTPServer的用法吗?server.serve_forever().
好了,到此为止,事情已经告一段落,虽然很多事情还不清楚,比如请求是如何封装的,响应在哪里处理,如何工作,比如URL路由。不过我们对Werkzeug已经有了一个大概的印象,知道他的下层是用HTTPServer实现的,没有太多特别的自定义协议。下一章,我们将逐步进行更深入的解密。敬请关注。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。