flask一次request请求过程 基于tag0.1

来源:互联网 发布:sql删除语句 编辑:程序博客网 时间:2024/06/16 17:53

以下是基于flask@0.1(从最简单的开始)

前提:

    flask是一个web app,它是跟wsgi_server交互的。他们之间的关系就不在这里叙述了详情请看 WSGI接口


从这里开始:

    def wsgi_app(self, environ, start_response):        """The actual WSGI application.  This is not implemented in        `__call__` so that middlewares can be applied:            app.wsgi_app = MyMiddleware(app.wsgi_app)        :param environ: a WSGI environment        :param start_response: a callable accepting a status code,                               a list of headers and an optional                               exception context to start the response        """        with self.request_context(environ):            rv = self.preprocess_request()            if rv is None:                rv = self.dispatch_request()            response = self.make_response(rv)            response = self.process_response(response)            return response(environ, start_response)

1.首先根据由wsgi server传过来的environ构造一个request content(请求上下文),然后将请求上下文推入_request_ctx_stack中
_request_ctx_stack.push(self)

2.request开始处理前,看看有没有需要预处理的func(通过@before_request修饰器的函数)
for func in self.before_request_funcs:    rv = func()

3.由url找到对应endpoint,并从route表找到对应的view_function对该request进行处理,如果发生exception,就交给对应的errorhandler进行处理
 def dispatch_request(self):        """        try:            endpoint, values = self.match_request()            return self.view_functions[endpoint](**values)        except HTTPException, e:            handler = self.error_handlers.get(e.code)            if handler is None:                return e            return handler(e)        except Exception, e:            handler = self.error_handlers.get(500)            if self.debug or handler is None:                raise            return handler(e)

4.通过步骤3,一个request已经被处理完了,然后准备进行response,传入由步骤三产生的rv,构造response object
response = self.make_response(rv)

5.进行response
return response(environ, start_response)
这里主要是由werkzeug库中的Response内处理,调用BaseResponse类的__call__函数跟wsgi app进行交互

最后:
在函数wsgi_app()结束之后,_request_ctx_stack会pop出在栈顶的元素



总结:
   本文章比较简单,并没有介绍Request和Response这两个主要的处理类。只是大概说了一下request响应的大体流程。在flask0.1的时候flask还是比较简单,单个文件,跟bottle类似。





0 0
原创粉丝点击