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类似。
相关文章推荐
- flask一次request请求过程 基于tag0.7
- flask一次request请求过程 基于tag0.2和0.3
- Dojo初探之5:dojo的request(请求)操作、请求过程事件绑定和隐藏数据data()操作(基于dojo1.11.2版本)
- 一次请求中,经过 nginx+uWSGI+flask应用程序搭建服务的执行过程
- 一次完整的HTTP请求过程
- 一次Web请求过程详解
- 基于HttpWebRequest的通用请求和响应处理
- 请求与响应原理图及Tomcat对request的处理过程
- 一次查询请求及响应的过程
- java web 一次请求编码设置的过程
- python web开发-flask中访问请求数据request
- NetWork——描述一次完整的网络请求过程
- flask的request_context原理 基于flask v0.1
- Web开发中的四个域对象: page(jsp有效) request(一次请求) session(一次会话) application(当前web应用)
- 一次完整的HTTP请求过程
- XMLHttpRequest——这是什么、怎样完整地执行一次GET请求、怎样检测错误。
- 一次完整的 HTTP 请求过程
- 一次完整的Http请求过程
- XMLHttpRequest是什么、如何完整地运行一次GET请求、如何检測错误。
- 一次完整的HTTP请求过程