您的位置:首页 > 产品设计 > UI/UE

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

2017-02-25 19:05 363 查看



以下是基于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类似。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python flask