Django有wsgi当做socket,而flask自身是没有wsgi的,他是通过werkzeug来实现的.

看源码

下面看下源码是如何实现的:

#这是我们写的flask代码
from flask import Flask app = Flask(__name__) #先实例化对象 @app.route('/index') #将/index路径和index函数名做了映射(对应关系)然后放到flask里面去
def index():
        return 'hello world' if __name__ == '__main__':
        app.run() #从app.run()启动项目

点击(ctrl+左键,后文的点击全是这样的)run进到源码,这里的self就是app(app就是Flask实例化的对象)

往下走,找到

点击run_simple进入到源码,这个run_simple其实就是werkzeug的代码了,进来之后,flask项目就hang住了,等待请求的进来.

注意,run_simple封装的内容中 hostname(主机名/IP地址),port(端口),application(函数名)是必须写的

werkzeug模拟flask

代码我们现在只能写:

from werkzeug.serving import run_simple

def func(environ,start_response):       #我们需要知道视图函数的返回值是啥,才能进一步写代码
        print('请求来了') if __name__ == '__main__':
        run_simple('127.0.0.1',5000,func) #这里括号的内容上面源码有解释,func是个函数名,当请求来时会自动执行第三个参数+(),也就是执行func函数func(),然后就跳到上面去执行func函数了

继续看flask代码:

from flask import Flask

app = Flask(__name__)             #先实例化对象

@app.route('/index')              #将/index路径和index函数名做了映射(对应关系)然后放到flask里面去
def index():
        return 'hello world' if __name__ == '__main__':
        app.run() #从app.run()启动项目

app.__call__ #因为对象+()就会执行类的__call__方法,所以我们从Flask的__call__方法进入源码

点击call进入Flask源码

我们已经进入到Flask源码了,再点击wsgi_app

其实wsgi_app就在call上面,而它的返回值response(environ, start_response)其实就是要返回给用户的,就是我们要找的视图函数的返回值.

response就是上面2449行得到的

点full_dispatch_request进去

这里rv我门就不深推了,他其实就是视图函数返回的字符串.

返回时对rv做了处理,我们点finalize_request进去

这里最后的response就是整个视图函数的返回值,点make_response进去

经过一系列判断,这里最后就返回了rv,rv就是整个视图函数的返回值.

我们需要再看下2106行对rv的判断

再看下response_class

也就是说判断一下rv是不是Response的对象,

再往下走,rv是字符串,不是Response的对象,

这里就判断rv是不是字符串,rv是字符串再往下

这里你需要结合前面的过程来看:

这里就相当于是: rv = Response(rv, status=status, headers=headers),是个对象,rv是视图函数返回的字符串,需要传进去.而rv正好是make_response的返回值,而self.make_response他返回给了response.

所以response=Response(rv, status=status, headers=headers),而rv就是视图函数返回的字符串,后面的参数()status=status, headers=headers)可以不写,所以 response=Response("hello world")

rv这个字符串就被封装到rv这个Response的对象里面去了.

咱们再找response_class,点进去,找到Response

这里我们把鼠标放到标签上,看下当前Response所在的位置(路径)

此时我们的代码可以改为:

from werkzeug.serving import run_simple
from flask.wrappers import Response #新加的 def func(environ,start_response):
       print("请求来了")
response=Response("hello world")
return response(environ,start_response) #新加的 if __name__ == '__main__':
        run_simple('127.0.0.1',5000,func)

但是还是有点不严谨,因为你引用的模块是flask的,我们前面说了,werkzeug不需要flask,而是werkzeug为flask提供socket功能.

因为Response继承了ResponseBase,所以点进去看

这里,我们看到了在werkzzeug下的Response继承了BaseResponse,

我们再向上看,上面的import已经把BaseResponse给引过来了

所以我们可以在原来的代码上写from werkzeug.wrappers import  BaseResponse,或者我们再点进 BaseResponse看他从哪来

我们看下wrappers的init文件写啥:

这里是吧BaseResponse引到wrappers文件的init文件中了,你只要引入wrappers文件就可以倒入BaseResponse这个类了

所以from werkzeug.wrappers.response import BaseResponse 或者是from werkzeug.wrappers.base_response import BaseResponse

再或者from werkzeug.wrappers import BaseResponse都可以引入BaseResponse这个类

from werkzeug.serving import run_simple
from werkzeug.wrappers import BaseResponse def func(environ,start_response):
       print("请求来了")
         response=BaseResponse("你好")
         return response(environ,start_response) if __name__ == '__main__':
        run_simple('127.0.0.1',5000,func)

所以咱们可以不依赖flask只用werkzeug也可以实现搭建网站的功能.

通过werkzeug了解wsgi的更多相关文章

  1. 如何使用werkzeug创建WSGI APP

    注意 : 1.定义__call__的意义 class App(): def __init__(self): pass def method(self): pass app=App() app() #错 ...

  2. Werkzeug工具包学习-官方例子Shortly分析

    为了学习werkzeug的wsgi框架工具,今天真对官网的例子进行调试运行.涉及到了werkzeug工具包,jinja2前端模版,以及redis内存库,之后可以灵活定制自己主页.再次,作以记录. 首先 ...

  3. [转载]Python 资源大全

    原文链接:Python 资源大全 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex  ...

  4. python常用库

    本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:vinta.欢迎加入翻译组. Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 ...

  5. Python框架、库以及软件资源汇总

    转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...

  6. Flask微型框架入门笔记

    例程: from flask import Flask app = Flask(__name__) # 新建一个Flask可运行实体(名字参数如果是单独应用可以使用__name__变量,如果是modu ...

  7. Awesome Python

    Awesome Python  A curated list of awesome Python frameworks, libraries, software and resources. Insp ...

  8. Machine and Deep Learning with Python

    Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...

  9. Python 库大全

    作者:Lingfeng Ai链接:http://www.zhihu.com/question/24590883/answer/92420471来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...

随机推荐

  1. C# 全角半角字符互转

    /// <summary> /// 全角空格为12288,半角空格为32 /// 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 /// < ...

  2. access us

    Ubuntu下设置 chrome的SwitchyOmega Wiki (简体中文)wiki Linux安装配置客户端及开机自动启动 运维 安装 配置 搭建服务以及配置多用户 安装和配置 一键搭建 服务 ...

  3. ffmpeg结合SDL编写播放器(一)

    ffmpeg 工具是一个高效快速的命令行工具,进行视音频不同格式之间的转换. ffmpeg命令行 ffmpeg可以读取任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)读取,由 -i ...

  4. Instance Segmentation with Mask R-CNN and TensorFlow

    Back in November, we open-sourced our implementation of Mask R-CNN, and since then it’s been forked ...

  5. <每日 1 OJ> -LeetCode 13 . 罗马数字转正数

    题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 ...

  6. 面试官问我:平常如何对你的 Java 程序进行调优?

    阅读本文大概需要 10 分钟. 作者:张俊城, 郭理勇, 刘建来源:http://t.cn/AiCTERJz Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负 ...

  7. JavaScript初探系列(八)——DOM

    DOM(文档对象模型)是针对HTML和XML文档的一个API,描绘了一个层次化的节点树,允许开发人员添加.删除和修改页面的某一部分. HTML DOM 树形结构如下: 一.Node方面 (一).节点类 ...

  8. webssocket简介-服务器可以主动传送数据给浏览器

    WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并 ...

  9. 【深入学习linux】CentOS 7 最小化安装后的注意事项及一些必备组件的安装

    转载:https://blog.csdn.net/F_Srion/article/details/54910943 在VM虚拟机中安装CentOS 7 时 有时候顾虑到电脑硬件性能,我们需要最小化安装 ...

  10. 【用例篇】Xmind转为csv 导入禅道

    用过禅道的都知道,用例维护实在是太不方便了,有人推荐了一种方法,用Xmind先编写用例(思路比较清晰),写好之后借助工具(xmind2testcase)将用例转为CSV格式,之后再导入禅道 参考资料: ...