flask结构

gogogo

我们使用flask的时候通常要先pip install flask,那你了解flask的结构吗?知识是需要梳理的哦!

下载flask框架 = flask服务器(werkzeug) + flask web框架

一个最简单的flask程序

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_flask():
    return 'Hello, Flask!'
if __name__ == "__main__":
    app.run()

下载完成flask框架后会内置一个服务器,基于werzeug这个模块
这个内置的服务器可以用app.run调用
我们就先弄清楚服务器与web框架这两部分是如何耦合的吧!

当app.run()启动服务器
进入run()方法查看源码发现
将会调用run_simple方法启动服务器并传入self,这个self是Flask类的对象,即传入web应用,如下图所示:

由图可知我们向服务器中传self,但是不论传入什么,服务器最终会执行self()来处理请求
若我们传入函数的时候能函数能直接调用,若传入的是对象(self)需要重写__call__方法,才能使对象以函数方式调用
接受到一个请求,当执行到__call__才真正用到flask框的功能,前面的都是服务器做的工作
wsgi服务器给web应用提供了两个参数给web框架,environ,start_response
这里写图片描述

environ

是一个字典,保存着关于请求的信息,具体内容如下:

{'wsgi.multiprocess': False, 'HTTP_COOKIE': 'sessionid=fswu68hxp46zbi03acfmkvdqrj4lbnui; 
csrftoken=mu6mkGMbI7Gi0Td9JNZKDzBfV3eCLEcy2KMIvsvpDXC5UQWQy0Ap5MrEcyV7KuOt; session=eyJsaW1pdHMiOnsiIGIiOiJZV1J0YVc0PSJ9LCJ1c2VybmFtZSI6eyIgYiI6ImVtaGhiMmgxWVE9PSJ9fQ.Defdrg.BrUdNxUjgg9Ui8TpAhRd5gQvY_0', 'SERVER_SOFTWARE': 
'Werkzeug/0.14.1', 'SCRIPT_NAME': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/appbox/show_img/IC/', 'SERVER_PROTOCOL': 'HTTP/1.1', 'QUERY_STRING': '', 
'werkzeug.server.shutdown': <function shutdown_server at 0x0000000006548518>, 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', 'HTTP_CONNECTION': 
'keep-alive', 'SERVER_NAME': '0.0.0.0', 'REMOTE_PORT': 3834, 'wsgi.url_scheme': 'http', 'SERVER_PORT': '5050', 'werkzeug.request': 
<BaseRequest 'http://127.0.0.1:5050/appbox/show_img/IC/' [GET]>, 'wsgi.input': <socket._fileobject object at 0x000000000650D408>, 'HTTP_HOST': '127.0.0.1:5050', 'wsgi.multithread': False, 
'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_ACCEPT':'text/html,application/xhtml+xml,application/xml;q=0.9,image/we
bp,image/apng,*/*;q=0.8', 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.errors': <open file '<stderr>', mode 'w' at 0x0000000004ACB150>, 'REMOTE_ADDR': '127.0.0.1', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 
'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br'}

start_response

start_response 目的是根据web给出的数据生成消息报文(response的一部分)
WSGIRequestHandler类的一个方法,
def start_response(status, response_headers, exc_info=None):
根据传入的状态码,头信息,返回一个函数
这个函数需要一个参数data就能设置返回的body,flask对其进行了封装,使我们很容易不去关心response的生成

由此可知,flask只需把flask这个类的对象传递给服务器,并且
__call__只需要返回给服务器符合wsgi标准的response(利用start_response)即可实现web服务器与web框架的连接

弄清楚flask框架与服务器的链接关系,就能更清晰的思考服务器的实现原理了!


书山有路勤为径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值