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. (尚034)Vue_案例_数据存储优化(代码优化!!!)

    最好能将上述代码抽取成一个模块(读json数据+写json数据) 1.在src下新建文件夹util(util文件夹用于放入工具的模块) 2.*使用localStorage存储数据的工具模块* 一个模块 ...

  2. nginx之rewrite及防盗链

    rewrite示例-自动跳转https 示例1:自动把首页的http转化成https location / { root /data/nginx/pc/html; index index.html; ...

  3. IntelliJ IDEA 统一设置编码为utf-8编码 /idea设置编码

    问题一. File->Settings->Editor->File Encodings 问题二. File->Other Settings->Default Settin ...

  4. java基础之 clone

    参考文档:深拷贝&浅拷贝:http://blog.csdn.net/cws1214/article/details/52193341 克隆的分类:  (1)浅克隆(shallow clone) ...

  5. .Net Core3 新特性整理

    .net core 3实现了.net 标准2.1. 1.生成可执行文件 以前版本需要dotnet run运行项目,.net core 3支持直接生成目标平台的可执行文件.比如windows就是exe了 ...

  6. Linux(环境篇):系统搭建本地FTP后,无法登录(331 Please specify the password.)问题解决

    首先 Linux 搭建ftp,开放21端口.(省略...) 你可能会遇到以下问题:错误 SELinux is disabled 解决: setenforce: SELinux is disabled ...

  7. [zhuan]SQLSERVER 数据库性能的基本

    SQLSERVER 数据库性能的基本 很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能 比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据 ...

  8. 解析生效测试方法 执行命令 ping 域名 得不到 IP 主要有如下几个原因:

    https://help.aliyun.com/knowledge_detail/39834.html dig https://cloud.tencent.com/document/product/3 ...

  9. Python + Selenium 自动发布文章(一):开源中国

    https://blog.csdn.net/qq_28804275/article/details/80891949 https://blog.csdn.net/qq_28804275/article ...

  10. Centos7.5 php7.2 安装pdo_sqlsrv 连接 sql server(转)

    Centos7.5 php7.2 安装pdo_sqlsrv 连接 sql server 转:https://blog.csdn.net/gdali/article/details/82912542   ...