构建python框架的方法与步骤

为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点:

你有一个新奇的想法,觉得将会取代其他的框架

你想要获得一些名气

你遇到的问题很独特,以至于现有的框架不太合适

你对 web 框架是如何工作的很感兴趣,因为你想要成为一位更好的 web 开发者。

接下来的笔墨将着重于最后一点。这篇文章旨在通过对设计和实现过程一步一步的阐述告诉读者,我在完成一个小型的服务器和框架之后学到了什么。你可以在这个 代码仓库 中找到这个项目的完整代码。

我希望这篇文章可以鼓励更多的人来尝试,因为这确实很有趣。它让我知道了 web 应用是如何工作的,而且这比我想的要容易的多!

范围

python框架可以处理请求-响应周期、身份认证、数据库访问、模板生成等部分工作。Web 开发者使用框架是因为,大多数的 web 应用拥有大量相同的功能,而对每个项目都重新实现同样的功能意义不大。

比较大的的框架如 Rails 和 Django 实现了高层次的抽象,或者说“自备电池”(“batteries-included”,这是 Python 的口号之一,意即所有功能都自足。)。而实现所有的这些功能可能要花费数千小时,因此在这个项目上,我们重点完成其中的一小部分。在开始写代码前,我先列举一下所需的功能以及限制。

功能:

处理 HTTP 的 GET 和 POST 请求。你可以在 这篇 wiki 中对 HTTP 有个大致的了解。

实现异步操作(我喜欢 Python 3 的 asyncio 模块)。

简单的路由逻辑以及参数撷取。

像其他微型框架一样,提供一个简单的用户级 API 。

支持身份认证,因为学会这个很酷啊(微笑)。

限制:

将只支持 HTTP 1.1 的一个小子集,不支持传输编码transfer-encoding、HTTP 认证http-auth、内容编码content-encoding(如gzip)以及 持久化连接 等功能。

不支持对响应内容的 MIME 判断 - 用户需要手动指定。

不支持 WSGI - 仅能处理简单的 TCP 连接。

不支持数据库。

我觉得一个小的用例可以让上述内容更加具体,也可以用来演示这个框架的 API:

from diy_framework import App, Router

from diy_framework.http_utils import Response

#GET simple route

async def home(r):

rsp= Response()

rsp.set_header(’Content-Type’, ’text/html’)

rsp.body= ’test

return rsp

#GET route +params

async def welcome(r,name):

return "Welcome {}".format(name)

#POST route +body param

async def parse_form(r):

if r.method== ’GET’:

return ’form’

else:

name=r.body.get(’name’, ’’)[0]

password=r.body.get(’password’, ’’)[0]

return "{0}:{1}".format(name,password)

#application=router+http server

router= Router()

router.add_routes({

r’/welcome/{name}’:welcome,

r’/’:home,

r’/login’:parse_form,})

app= App(router)

app.start_server()

’ 用户需要定义一些能够返回字符串或 Response 对象的异步函数,然后将这些函数与表示路由的字符串配对,最后通过一个函数调用(start_server)开始处理请求。

完成设计之后,我将它抽象为几个我需要编码的部分:

接受 TCP 连接以及调度一个异步函数来处理这些连接的部分

将原始文本解析成某种抽象容器的部分

对于每个请求,用来决定调用哪个函数的部分

将上述部分集中到一起,并为开发者提供一个简单接口的部分

我先编写一些测试,这些测试被用来描述每个部分的功能。几次重构后,整个设计被分成若干部分,每个部分之间是相对解耦的。这样就非常好,因为每个部分可以被独立地研究学习。以下是我上文列出的抽象的具体体现:

一个 HTTPServer 对象,需要一个 Router 对象和一个 http_parser 模块,并使用它们来初始化。

HTTPConnection 对象,每一个对象表示一个单独的客户端 HTTP 连接,并且处理其请求-响应周期:使用 http_parser 模块将收到的字节流解析为一个 Request 对象;使用一个 Router 实例寻找并调用正确的函数来生成一个响应;最后将这个响应发送回客户端。

一对 Request 和 Response 对象为用户提供了一种友好的方式,来处理实质上是字节流的字符串。用户不需要知道正确的消息格式和分隔符是怎样的。

一个包含“路由:函数”对应关系的 Router 对象。它提供一个添加配对的方法,可以根据 URL 路径查找到相应的函数。

最后,一个 App 对象。它包含配置信息,并使用它们实例化一个 HTTPServer 实例。

让我们从 HTTPConnection 开始来讲解各个部分。

模拟异步连接

为了满足上述约束条件,每一个 HTTP 请求都是一个单独的 TCP 连接。这使得处理请求的速度变慢了,因为建立多个 TCP连接需要相对高的花销(DNS 查询,TCP 三次握手, 慢启动 等等的花销),不过这样更加容易模拟。对于这一任务,我选择相对高级的 asyncio-stream 模块,它建立在 asyncio 的传输和协议 的基础之上。我强烈推荐你读一读标准库中的相应代码,很有意思!

一个 HTTPConnection 的实例能够处理多个任务。首先,它使用 asyncio.StreamReader 对象以增量的方式从 TCP 连接中读取数据,并存储在缓存中。每一个读取操作完成后,它会尝试解析缓存中的数据,并生成一个 Request 对象。一旦收到了这个完整的请求,它就生成一个回复,并通过 asyncio.StreamWriter 对象发送回客户端。当然,它还有两个任务:超时连接以及错误处理。

你可以在 这里 浏览这个类的完整代码。我将分别介绍代码的每一部分。为了简单起见,我移除了代码文档。

class HTTPConnection(object):

def init(self,http_server,reader,writer):

self.router=http_server.router

self.http_parser=http_server.http_parser

self.loop=http_server.loop

self._reader=reader

self._writer=writer

self._buffer=bytearray()

self._conn_timeout= None

self.request= Request()

这个 init 方法没啥意思,它仅仅是收集了一些对象以供后面使用。它存储了一个 router 对象、一个 http_parser 对象以及loop 对象,分别用来生成响应、解析请求以及在事件循环中调度任务。

然后,它存储了代表一个 TCP 连接的读写对,和一个充当原始字节缓冲区的空 字节数组 。_conn_timeout 存储了一个asyncio.Handle 的实例,用来管理超时逻辑。最后,它还存储了 Request 对象的一个单一实例。

下面的代码是用来接受和发送数据的核心功能:

async def handle_request(self):

try:

while not self.request.finished and not self._reader.at_eof():

data=await self._reader.read(1024)

if data:

self._reset_conn_timeout()

await self.process_data(data)

if self.request.finished:

await self.reply()

elif self._reader.at_eof():

raise BadRequestException()

except (NotFoundException,

BadRequestException) as e:

self.error_reply(e.code,body=Response.reason_phrases[e.code])

except Exception as e:

self.error_reply

文章来源:SDK.cn

时间: 2024-10-14 08:32:22

构建python框架的方法与步骤的相关文章

android模拟器(genymotion)+appium+python 框架执行基本原理(目前公司自己写的)

android模拟器(genymotion)+appium+python 框架执行的基本过程: 1.Push.initDate(openid)方法     //业务数据初始化 1.1   v5db.push_to_db(filename, openid) //通过执行filename文件里sql语句,使业务数据初始化,比如物理删除订单,以确保不会因为数据原因导致自动化执行失败 2.Android.Android.init_Android(self)  //初始化Android模拟器 class

python django+uwsgi+nginx 搭建步骤(血一般的教训)

安装Django 没有pip的童鞋可以看http://blog.csdn.net/imphp/article/details/38228619安装python包管理工具pip 先在 https://pypi.python.org/ 上 搜索Django,排在第一的那个就是我们要安装的主要框架Django啦- 点进去可以查找一些相关文档,虽然全部是鸟语花香,不过有翻译.百度.炕忙,就算是菜鸟也成英国鸟了. Django 的官网文档 https://docs.djangoproject.com/en

10款Web开发最佳的Python框架

Python是跻身于当代IT世界最流行和代码最高效的编程语言之一.Python框架能帮助你快速启动Web应用. 1.CubicWeb CubicWeb的最重要的功能是其代码的可重用性,由一个个代码单元组成.它灵活又强大,并且还有一些特别的功能,包括RQL查询语言和支持有效编码的语义视图功能.这是语义Web应用程序的最佳解决方案,并且提供理想的环境. 作为一个程序员,我们必须了解Python这门编程语言的灵活和强大.框架的选择取决于Web应用程序的使用目的和复杂程度.测量项目所需的负荷.可扩展性和

python 框架

python -m SimpleHTTPServer 从GitHub中整理出的15个最受欢迎的Python开源框架. 这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. Diesel:基

Python中strip方法的妙用

[开胃小菜] 当提到python中strip方法,想必凡接触过python的同行都知道它主要用来切除空格.有以下两种方法来实现. 方法一:用内置函数 #<python> if __name__ == '__main__': str = ' Hello world ' print '[%s]' %str.strip() #</python> 方法二:调用string模块中方法 #<python> import string if __name__ == '__main__

安装python,setuptools,get-pip.py,ipython构建python开发环境

安装python,setuptools,get-pip.py,ipython,构建python开发环境 安装环境:Centos6.7 ,安装时选项为桌面,增加了开发工具包. 1.python2.7.11安装 下载源代码: wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz 安装: ./configure make make install 2.安装setuptools wget https://pypi.python.o

无铜环双界面智能卡封装框架制作方法

无铜环双界面智能卡封装框架制作方法,属于电子信息技术领域,主要应用于IC封装框架领域.本发明首先采用一面带铜的环氧树脂布,经冲压.前处理.覆膜.曝光.显影.蚀刻制作出第二接触层(3):再在无铜箔面贴铜箔.烘干.前处理.覆膜.曝光.显影.蚀刻制作出第一接触层(2):然后,对第一接触层(2)和第二接触层(3)进行表面处理.导电线大大减少的双界面智能卡封装框架,减少了镀金的面积,节约了成本.而且贴入芯片时,减少了导线因与铜环接触而发生短路的可能性. 1.无铜环双界面智能卡封装框架制作方法,其特征在于:

10个用于Web开发的最好 Python 框架

Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还自带服务器.其它方面,Python拥有足够多的免费数据函数库.免费的Web网页模板系统.还有与Web服务 器进行交互的库.这些都可以设计到你的Web应用程序里面.在这篇文章里,我们将为Python Web开发者介绍基于Python的10大Web应用框架. CubicWeb CubicWeb的最重要的

15个流行的python框架

Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. Diesel:基于Greenlet的事件I/O框架 Diesel提供一个整洁的API来编写网络客户端和服务器.支持TCP和UDP. Flask:一个用Python编写的轻量级Web应用框架 Flask是一个使用P