Flask初探之WSGI

Flask是一个使用 Python 编写的轻量级 Web 应用框架。较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,小型团队在短时间内就可以完成功能丰富的中小型网站。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能的同时实现丰富的功能扩展。Flask强大的插件库也可以让用户实现个性化的网站定制,开发出功能强大的网站。
Flask 的三个特点:轻量级、灵活、定制型强。接下来将用5篇来介绍Flask原理,难度由浅入深。
flask demo
首先以最快的的方法跑一个最简单的Flask程序。
app.py
import time
from flask import Flask
# 实例化一个Flask类,app代表着flask程序。
app = Flask(__name__)
# 向flask实例添加一个路由
@app.route('/')
def hello_world():
return 'Hello World!'
运行flask
flask run

访问127.0.0.1:5000

从flask中导入Flask类,然后实例化Flask类得到一个应用程序:app。
在实例化Flask时,传入了一个参数__name__,该参数代表文件名,本例中就是app。传入参数主要为了定位文件,可以通过传入这个名字确定程序的根目录,以便获得静态文件和模板文件的目录。
微框架
在官方介绍中, Flask被称为微框架,那么这里的微是什么意思呢?
这里的微并不意味着 Flask 功能简陋,而是指其保留核心且易于扩展。有许多 Web程序不需要后台管理、用户认证、权限管理,有些甚至不需要表单或数据库,所以 Flask 并没有内置这类功能,而是把这些功能都交给扩展或用户自己实现。
正因为如此,从只需要渲染模板的小项目到需要各种功能的大项目,Flask 几乎能够适应各种情况。 Flask的这一设计理念正印证了《Zen of Python 》里的这一句Simple is better than complex
WSGI
Flask作为一个web框架,WSGI是必须要实现的组件。那么什么是WSGI?在web框架中的作用又是什么?
web框架分为两个部分,分别是:
- 服务端程序:接收客户端发送的请求
- 应用程序:处理客户端的请求
WSGI:Web Server Gateway Interface 网站服务网关接口,一种网络请求的规范,服务端程序就是实现了WSGI规范的程序。Flask是处理客户端请求的应用程序。
两者的关系如下:

为什么需要服务端程序?难道不可以直接将请求发送给应用端吗?
因为在处理请求时不希望接触到TCP连接、HTTP原始请求、请求定位等底层数据处理,所以需要一个统一的接口帮助我们来处理这些的数据,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。WSGI定义了一种规范,将请求原始数据处理好,以固定的格式传递给应用程序。凡是实现了WSGI规范的程序都可以称之为服务器程序。
应用程序如何工作?:
当一个请求过来之后服务端程序将请求解析,并根据请求的内容调用处理函数,这里处理函数就是应用程序。应用程序接收到参数,处理并返回结果。
从请求数据格式的角度来看:
HTTP请求到我们的Web程序之间,有一个转换过程——从Http报文到WSGI 规定的数据格式。实现了WSGI的程序则可以视为客户端请求和我们的Web程序之间沟通的桥梁。
数据格式的转化如下:

WSGI工作细节
python自带的一个简单的wsgi服务,通过该服务来探究WSGI的工作细节。
wsgi_simple.py
# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
def application(environ, start_response):
start_response('200 ok', [('Content-Type', 'text/html')])
return [b'<h1>hello wsgi!</h1>']
# 创建一个服务器,IP地址为空,端口是8080,处理函数是application:
httpd = make_server('', 8080, application)
print ("Serving HTTP on port 8080...")
# 开始监听HTTP请求:
httpd.serve_forever()

访问127.0.0.1:8080

根据WSGI的规定,应用程序必须是一个可调用对象(call able object)。
WSGI务器启动后会监听本机的对应端口。当接收到请求时,将请求报文解析为一个 environ字典, 同时提供一个设置服务器状态和各种返回头标志的函数start_response,将environ和start_response作为参数,调用应用端程序真正处理请求。
参数:可调用对象接收两个参数
- environ 包含了请求的所有信息的字典
- start_response 通知服务器响应状态并设置各种标头
返回:可迭代对象
在上例中application就是应用程序,它是一个函数,也可以是方法或类。接受的参数是wsgiref服务端程序提供的environ和start_response,返回值是一个字节串,可迭代对象。
总结一下web框架两个组件的功能:
服务端程序:
- 监听本机端口
- 将请求解析成字典
- 调用应用程序,将结果返回给请求方
应用程序:
- 接受
environ和start_response两个参数 - 设置返回状态和返回头部信息
Flask初探之WSGI的更多相关文章
- Flask学习-Flask基础之WSGI
一.WSGI为什么会出现? 在学习一个东西之前,我们肯定想知道:它为什么会出现?那么,WSGI为什么会出现呢? 我们知道,部署一个web应用,经常需要使用nginx.apache或者IIS等web服务 ...
- web 部署专题(四):压力测试(二)压力测试实例 flask 四种wsgi方式对比(tornado,Gunicorn,Twisted,Gevent)
使用工具:siege 代码结构: hello.py templates |--hello.html hello.py代码: from flask import Flask, render_templa ...
- flask初探
为什么我们需要模板 让我们来考虑下我们该如何扩充我们这个小的应用程序. 我们希望我们的微博应用程序的主页上有一个欢迎登录用户的标题,这是这种类型的应用程序的一个"标配".忽略本应用 ...
- Flask中请求数据的优雅传递
当一个请求到来时,浏览器会携带很多信息发送发送服务端.在Django中,每一个处理函数都要传入一个request的参数,该参数携带所有请求的信息,也就是服务端程序封装的environ(不明白该参数可以 ...
- nginx,wsgi,flask之间的关系
之前看写flask 应用的一些疑问,百度上的答案解释的不错,这里记着以后可以看看Web 服务器层对于传统的客户端 - 服务器架构,客户端向服务器发送请求,服务器接收请求,处理请求,最后给客户端返回请求 ...
- 如何理解Nginx, WSGI, Flask之间的关系
概览 之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑.通过查阅了些资料,总算把它们的关系理清了. 总括来说,客户端从发送一个 ...
- 如何理解Nginx, WSGI, Flask(Django)之间的关系
如何理解Nginx, WSGI, Flask(Django)之间的关系 值得指出的是,WSGI 是一种协议,需要区分几个相近的名词: uwsgi 同 wsgi 一样也是一种协议,uWSGI服务器正是使 ...
- web服务器、WSGI跟Flask(等框架)之间的关系
之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑.通过查阅了些资料,总算把它们的关系理清了. 总括来说,客户端从发送一个 HTT ...
- 一个web应用的诞生(1)--初识flask
基于flask的web应用的诞生 Flask是一个非常优秀的web框架,它最大的特点就是保持一个简单而易于扩展的小核心,其他的都有用户自己掌握,并且方便替换,甚至,你可以在社区看到众多开源的,可直接用 ...
随机推荐
- 详解nohup /dev/null 2>&1 含义的使用
https://www.jb51.net/article/169837.htm 这篇文章主要介绍了详解nohup /dev/null 2>&1 含义的使用,文中通过示例代码介绍的非常详细 ...
- 用一道题 来 复习 MySQL 的 复杂 sql 语句
1.前言 太久没有在数据库做一些复杂的sql了,基本上将数据库的查询逻辑全放在了Java里做, 一来呢,可以减轻数据库的负担,二来呢,在java写,逻辑感会更强,数据类型更丰富也容易操作. 然而... ...
- Android 12(S) 图形显示系统 - 示例应用(二)
1 前言 为了更深刻的理解Android图形系统抽象的概念和BufferQueue的工作机制,这篇文章我们将从Native Level入手,基于Android图形系统API写作一个简单的图形处理小程序 ...
- 抓包分析与mock实战
Charles下载安装 官网下载安装:https://www.charlesproxy.com/ 电脑证书配置 如果不配置证书,无法抓取https协议 配置证书: 1 - 打开Charles,在hel ...
- Solon Web 开发,十四、与Spring、Jsr330的常用注解对比
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- 【机器学习】kNN
机器学习算法--kNN 目录 机器学习算法--kNN 1. 算法原理 2. 算法实现 2.1 kd-tree构造 2.2 kd-tree查询 2.3 kNN算法实现 3. 算法测试 Ref 1. 算法 ...
- 【刷题-LeetCode】162 Find Peak Element
Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...
- 在DigitalOcean vps中安装vnstat监控流量,浏览器打开php代码。。。
由于DigitalOcean中没有发现可以观察已用流量的功能,有想知道自己的流量使用情况,所以安装了vnstat. 安装过程十分简单,见百度经验,官方主页等. 1.安装完vnstat后,直接命令vns ...
- 搭建服务器之www-向外提供视频服务by html5 video标签
搭建好www服务器,主要目的有两个一个是试验下,另一个是想给女朋友个惊喜,给她个带视频的网页,嘿嘿当前测试下相应功能. 1,采用html5的视频功能:bideo标签. 源码如下: <!docty ...
- 推荐召回--基于用户的协同过滤UserCF
目录 1. 前言 2. 原理 3. 数据及相似度计算 4. 根据相似度计算结果 5. 相关问题 5.1 如何提炼用户日志数据? 5.2 用户相似度计算很耗时,有什么好的方法? 5.3 有哪些改进措施? ...