Werkzeug 是一个WSGI工具包,也可以作为一个Web框架的底层库。

WSGI


在介绍Werkzeug之前,先介绍一下 WSGI(Python Web Server Gateway Interface),它为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。这是一个规范,描述了web server如何与web application交互、web application如何处理请求,该规范的具体描述在PEP3333,强烈推荐先阅读 PEP3333 再回头来阅读本文。

WSGI 分为两个部分:

  • Server/Gateway: 即是HTTP Server, 负责从客户端(Nnginx、apache、IIS)接收请求,将 request 转发给 application, 并将 application(可能是个Flask应用) 返回的response 返回给客户端
  • Application/Framework: 一个python web 应用或 web 框架接收由 server 转发的request,处理请求,并将处理结果返回给 server

可以通过下面两张图片来梳理一下它们之间的调用关系:

先从一份示例代码理解:

def application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/plain')])return ['Hello World!']

一个最基本的 WSGI 应用就是如上所示,定义了一个 application 函数(callable object),callable object(可调用对象) 包括:实现了__call__方法的函数、方法、类或实例都可以用作应用程序对象。这个函数接受两个参数,分别是environ和start_response。

  • environ是一个字典包含了CGI中的环境变量
  • start_response也是一个callable,接受两个必须的参数,status(HTTP状态)和response_headers(响应消息的头)

通过回调函数(start_response)将响应状态和响应头返回给 server,同时返回响应正文(response body),响应正文是可迭代的、并包含了多个字符串。

Werkzeug


werkzeug 提供了 python web WSGI 开发相关的功能:

  • 路由处理:如何根据请求 URL 找到对应的视图函数
  • request 和 response 封装: 提供更好的方式处理request和生成response对象
  • 自带的 WSGI server: 测试环境运行WSGI应用

下面使用 Werkzeug 来实现一个简单的WSGI应用:

from werkzeug.wrappers import Request, Responsedef application(environ, start_response):request = Request(environ)text = 'Hello %s!' % request.args.get('name', 'World')response = Response(text, mimetype='text/plain')return response(environ, start_response)

如上代码所示,请求数据需要环境对象,Werkzeug允许你以一个轻松的方式访问数据。响应对象是一个 WSGI 应用,提供了更好的方法来创建响应。

具体创建一个 WSGI 应用请查看文档,后面会陆续提到Flask框架中使用到Werkzeug的数据结构。这里贴一些官方文档的例子,使用werkzeug创建一个web 应用:

import os
import redis
import urlparse
from werkzeug.wrappers import Request, Response
from werkzeug.routing import Map, Rule
from werkzeug.exceptions import HTTPException, NotFound
from werkzeug.wsgi import SharedDataMiddleware
from werkzeug.utils import redirect
from jinja2 import Environment, FileSystemLoaderclass Shortly(object):""" Shortly 是一个实际的 WSGI 应用,通过 __call__ 方法直接调 用 wsgi_app,同时通过一个可选设置创建一个中间件,将static文件夹暴露给用户:"""def __init__(self, config):self.redis = redis.Redis(config['redis_host'], config['redis_port'])def dispatch_request(self, request):return Response('Hello World!')def wsgi_app(self, environ, start_response):request = Request(environ)response = self.dispatch_request(request)return response(environ, start_response)def __call__(self, environ, start_response):return self. wsgi_app(environ, start_response)def create_app(redis_host='localhost', redis_port=6379, with_static=True):app = Shortly({'redis_host':       redis_host,'redis_port':       redis_port})if with_static:app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {'/static':  os.path.join(os.path.dirname(__file__), 'static')})return appif __name__ == '__main__':from werkzeug.serving import run_simpleapp = create_app()run_simple('127.0.0.1', 5000, app, use_debugger=True, use_reloader=True)

思路很简单,我们的 Shortly 是一个实际的 WSGI 应用。 __call__ 方法直接调用 wsgi_app 。这样做我们可以装饰 wsgi_app 调用中间件,就像我们在 create_app 函数中做的一样。 wsgi_app 实际上创建了一个 Request 对象,之后通过 dispatch_request 调用 Request 对象然后给 WSGI 应用返回一个 Response 对象。正如你看到的:无论是创建 Shortly 类,还是创建 Werkzeug Request 对象来执行 WSGI 接口。最终结果只是从 dispatch_request 方法返回另一个 WSGI 应用。这部分解释来源于官方文档的中文版。

总结


本文主要解释了WSGI规范和Werkzeug(WSGI 工具集),以及如何实现一个符合WSGI规范的WSGI应用,最后使用Werkzeug 工具集中的相关模块,快速实现了一个基于WSGI的简单应用。

参考


Werkzeug 中文文档
Werkzeug 英文文档
WSGI Servers
WSGI协议的原理和实现

Werkzeug 与 WSGI 介绍相关推荐

  1. werkzeug实现WSGI Application

    WSGI 为 Web Server Gateway Inferface 的缩写,是 Python Web 框架(或应用程序)与 Web 服务器 (Web Server) 之间通讯的规范,本质上是定义了 ...

  2. WSGI、Flask及Werkzeug三者之间的关系

    目录 一.WSGI是什么? 二.Werkzeug是什么 三.Flask的WSGI实现 一.WSGI是什么? WSGI是一套接口规范.一个WSGI程序用以接受客户端请求,传递给应用,再返回服务器的响应给 ...

  3. Python Web 框架工具包 werkzeug

    一.什么是werkzeug werkzeug 官方的介绍说是一个 WSGI 工具包,不是一个web服务器,也不是一个web框架,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的 ...

  4. [转载] Python Web开发最难懂的WSGI协议,到底包含哪些内容? WSGI服务器种类和性能对比

    参考链接: 在Python中创建代理Web服务器 1 http://python.jobbole.com/88653/ 我想大部分Python开发者最先接触到的方向是WEB方向(因为总是有开发者希望马 ...

  5. flask常见面试题

    1. 什么是Flask,有什么优点? 概念解释: Flask是一个Web框架,就是提供一个工具,库和技术来允许你构建一个Web应用程序.这个Web应用程序可以是一些Web页面,博客,wiki,基于We ...

  6. [转载] python常用库

    参考链接: Python–新一代语言 转载至:https://www.cnblogs.com/jiangchunsheng/p/9275881.html 今天我将介绍20个属于我常用工具的Python ...

  7. Flask的大型网站模板

    Flask的大型网站模板 第一次学习使用Flask的时候是为了赶鸭子上架,那时候python和flask的优势就出来了,没有任何网站开发经验,两天部署出一个简单的微信公众平台,说到底这都是开源的力量, ...

  8. Odoo 8.0深入浅出开发教程

    转自:http://blog.sunansheng.com/python/odoo/odoo.html Table of Contents 1. ERP简介 1.1. Odoo历史 1.2. ERPⅡ ...

  9. python 常用库收集

    读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都 ...

最新文章

  1. SilverLight 一日两次碰壁
  2. Springboot,SSM框架比较,区别
  3. UNIX网络编程 第3章 套接字编程简介
  4. hdu 1163 ( 求n^n位根)
  5. Python实现——二元线性回归(最小二乘法)
  6. 谷歌浏览器安卓_安卓免费时代结束,国产手机或将集体涨价?
  7. 通过反射获得私有构造器,创建对象
  8. 设置IIS会话过期时间
  9. 电大计算机应用基础试卷号2007,电大计算机应用基础(试卷版)计算机试卷7.doc...
  10. java main 命令行_java Main 命令行
  11. Callback模式和Template模式
  12. python层次聚类_python中做层次聚类,使用scipy.cluster.hierarchy.fclusterdata方法 | 学步园...
  13. function signature是什么
  14. excel字符串和单元格拼接_Excel工作表中带单位求和的4个技巧,不掌握就真的Out了!...
  15. 火狐无法安装扩展_立即安装4个Firefox扩展
  16. EduCoder_web实训作业--JavaScript学习手册八:JS函数
  17. mac切换网卡|IP
  18. 手把手教你封装属于自己的Windows7安装镜像
  19. 这8个坏习惯加重体内湿气,一定要改掉!否则……
  20. 体育竞技游戏的团队AI

热门文章

  1. 块存储、文件存储、对象存储这三者的本质差别是什么?
  2. 【算法笔记】CNN Convolutional Neural Network (卷积神经网络)
  3. 在线 ocr 文字识别 和 图片色值选取
  4. 序列比对算法-计算生物学
  5. matlab 生成plc程序,利用MATLABsimulink的自动代码生成工具开发PLC程序..docx
  6. 第四讲 Django编程填空题的测评
  7. uniapp微信小程序新版本获取用户的头像和昵称,手机号
  8. 有100元人民币,分别有1、2、5元三种人民币组成,其中每种人民币至少有一张,请问有多少种组合方法
  9. matlab拟合曲线用什么,【Matlab】matlab如何使用拟合工具?matlab如何拟合曲线?matlab拟合工具cftool如何使用?...
  10. 【Transformer】Transformer理论知识