Flask 源码解析

  • 目标:
    阅读源码了解瓶服务器启动后,用户访问http://127.0.0.1:5000/后浏览“Hello World”这个过程Flask的工作原理及代码框架。
  • flask_ source.py源码:
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

  • Flask框架:
      1.浏览器发送一个IP地址,
      2.服务器收到地址以后把地址通过WSGI协议发送给WEB框架
      3.(服务端)地址是通过字典来保存的
          3.1 先定义一个字典(访问的IP地址)
          3.2 定义函数(接收响应头)
          3.3 WSGI接口函数的引用(接收响应体)
      4.WSGI协议是一个字典和一个函数的引用
          4.1 WSGI协议里面的API(函数)接口返回响应头和响应体(服务端接收到的数据)
      5.服务器接收到数据以后
          5.1 响应头+空行+响应体(渲染页面)
框架部分代码:
# 1.框架第一个思想:入口函数简洁
def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8'), ("class", "python11")])
# return :响应体显示
# environ:服务器给框架传数据,使用的是字典
# start_response:这个框架给服务器传响应头

    file_name = environ['file_name']  # 从字典中去获取路径
    for url, func in url_dict.items():
        match = re.match(url, file_name)
        # 判断当前是否匹配
        if match:
            # 说明匹配
            return func(match)

    # 如果都没有找到
    return "not page is find!"
# 根据不同的文件路径返回不同的内容,地址与我们函数的对应字典
def route(file_name):
    def set_fun(func):
        def call_fun(*args, **kwargs):
            print("额外功能")
            return func(*args, **kwargs)

        # 把地址跟函数添加到字典中
        url_dict[file_name] = call_fun  # 这个只能放在call_fun函数之后

        return call_fun

    return set_fun
# 2. 可调用对象是一个类实例
class AppClass:
    """这里的可调用对象就是 AppClass 的实例,使用方法类似于: 
        app = AppClass()
        for result in app(environ, start_response):
            do_somthing(result)
    """

    def __init__(self):
        pass

    def __call__(self, environ, start_response):
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        self.start(status, response_headers)
        yield "Hello world!\n"

服务器部分代码:
            .......
            # 定义传送数据的字典
            service_dict = dict()
            service_dict['file_name'] = file_name

            # 根据不同的路径返回不同的内容
            body = mini_07.application(service_dict, self.head_params)
            head = "HTTP/1.1 %s \r\n" % self.status  # 这个一定要在我们wsgi调之后再去拼接
            # 把响应头进行拼接
            for temp in self.params:
                head += "%s:%s\r\n" % (temp[0], temp[1])
            # head += "%s:%s\r\n"%(temp) 可以去试一下

            content = head + "\r\n" + body
            # 发送数据
            new_socket.send(content.encode("utf-8"))
            .......
    # 用来接收框架传过来响应头,函数在那里定义,那么对应的参数就会传过来
    def head_params(self, status, params):
        # 保存框架传过来的响应头
        self.status = status
        self.params = params
浏览器访问过程中wsgi的使用.png

WSGI

WSGI,全称Web服务器网关接口,或者Python Web服务器网关接口,是基于Python定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。WSGI接口的作用是确保HTTP请求能够转化成蟒蛇应用的一个功能调用,这也就是网关的意义所在,网关的作用就是在协议之前进行转换。
WSGI接口中有一个非常明确的标准,每个Python的网络应用必须是可调用的可调用的对象且返回一个iterator,并实现app(environ,start_response)的接口,server会调用应用程序,并传递给它的两个参数:environ包含请求的所有信息,start_response是应用程序处理完之后需要调用的函数,参数是状态码,响应头部还有错误信息引用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容