[关闭]
@dantangfan 2015-04-01T07:57:18.000000Z 字数 1253 阅读 2127

对easyweb的流程说明

写在前面

虽然WSGI看似简单,尽管它自己也说它很简单,但是真正实现起来逻辑确依然很复杂。

只有一点需要说明:看图的时候不看代码必然没有小鸡鸡

前方高能

我们可能你会说,我们平时看到的web应用程序都这个样儿啊

  1. @get('/')
  2. def index(request):
  3. return "hello World!"

是的,它们就是长成这个样子。这就是框架的好处,也是框架的坏处,它让初学者不知道web请求到底是怎么回事。

这里对代码调用过程做一个简单的流程说明。这个图只描述一次成功请求并且成功响应的过程,简化了其他出错处理或是判断条件,没有那些绕来绕去让人眼花的线,一根线拉到底,用文字作必要的描述。这样才能简单清晰的看到整个流程。

记住,实际应用中的请求可比这个复杂多了!!

Created with Raphaël 2.1.2StartWSGIServer:监听端口,接收浏览器请求。调用WSGIRequestHandlerWSGIRequestHandler:处理WSGIServer发送过来的reqeust,指定输入来源和出处接口,调用自生handle函数WSGIRequestHandler.handle:解析request数据,并初始化EasyServer对象,调用EasyServer的run函数EasyServer.run:接收一个application对象作为参数。开始执行内部请求过程,调用application对象获取对外输出的resultapplication:也就是我们代码中easyweb.handle_request,将传来的参数生成一个easyweb.Request对象,并从列表中查找相应的处理函数,也就是我们使用框架写出来的函@getxxx def indexindex(request):终于到了我们熟悉的地方。这个函数返回一个字符串或者Response这里,在easyweb.handler_request中接收了上面返回值,处理成一个response,然后返回essyweb.Response.sendeasyweb.Response.send:里面调用easyserver.EasyHandler.start_response,这个函数设置好需要的status和headers,返回的write函数对我们无关紧要,是PEP333要求兼容才这样做的然后essyweb.Response.send()返回刚刚初始化response的时候传入的将要输出的数据上面的数据直接返回到easyserver.EasyServer.run中,由result接收,接着run函数调用finish来结束请求easyserver.EasyServer.finish:它写数据,检查数据是否写完,然后清空这次连接的数据。这里PEP333明确规定,在第一次data发送之前,已经发送了headerEnd

其中,我们没有说明的只有最后一不和第一步。这涉及到如何从网络中读写数据,跟WSGI没有太大关系

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注