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