Werkzeug库——wrappers模块
Werkzeug库中的wrappers
模块主要对request
和response
进行封装。request
包含了客户端发往服务器的所有请求信息,response
包含了web应用返回给客户端的所有信息。wrappers
模块对请求和响应的封装简化了客户端、服务器和web应用通信的流程。本文主要介绍wrappers
模块中重要的类。
BaseRequest
BaseRequest
是一个非常基础的请求类,它可以和其他的“混合”类结合在一起构建复杂的请求类。只要传递一个环境变量environ
(由WSGI
服务器根据请求产生),便可以构造一个BaseRequest
实例。其构造函数如下:
1
2
3
4
5
|
def __init__(self, environ, populate_request=True, shallow=False):
self.environ = environ
if populate_request and not shallow:
self.environ['werkzeug.request'] = self
self.shallow = shallow
|
初始化后,形成的实例request
便具有了一些属性可以访问,这些属性只能以“只读”的方式访问。例如:
- url_charset
- want_form_data_parsed
- stream
- args
- data
- form
- values
- files
- cookies
- headers
- path
- full_path
- script_root
- url
- base_url
- url_root
- host_url
- host
- access_route
- remote_addr
BaseRequest
中还有两个类方法比较常用:
from_values(cls, *args, kwargs)**
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@classmethod
def from_values(cls, *args, **kwargs):
"""Create a new request object based on the values provided. If
environ is given missing values are filled from there. This method is
useful for small scripts when you need to simulate a request from an URL.
Do not use this method for unittesting, there is a full featured client
object (:class:`Client`) that allows to create multipart requests,
support for cookies etc.
This accepts the same options as the
:class:`~werkzeug.test.EnvironBuilder`.
.. versionchanged:: 0.5
This method now accepts the same arguments as
:class:`~werkzeug.test.EnvironBuilder`. Because of this the
`environ` parameter is now called `environ_overrides`.
:return: request object
"""
from werkzeug.test import EnvironBuilder
charset = kwargs.pop('charset', cls.charset)
kwargs['charset'] = charset
builder = EnvironBuilder(*args, **kwargs)
try:
return builder.get_request(cls)
finally:
builder.close()
|
这个类方法可以根据提供的参数构建一个请求。
application(cls, f)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@classmethod
def application(cls, f):
"""Decorate a function as responder that accepts the request as first
argument. This works like the :func:`responder` decorator but the
function is passed the request object as first argument and the
request object will be closed automatically::
@Request.application
def my_wsgi_app(request):
return Response('Hello World!')
:param f: the WSGI callable to decorate
:return: a new WSGI callable
"""
#: return a callable that wraps the -2nd argument with the request
#: and calls the function with all the arguments up to that one and
#: the request. The return value is then called with the latest
#: two arguments. This makes it possible to use this decorator for
#: both methods and standalone WSGI functions.
def application(*args):
request = cls(args[-2])
with request:
return f(*args[:-2] + (request,))(*args[-2:])
return update_wrapper(application, f)
|
这个类方法是一个装饰器,可以用来装饰WSGI
可调用对象或函数。
以上属性和方法的具体用法可以参考Request——werkzeug文档。
BaseResponse
BaseResponse
类是一个响应类,用它可以封装一个response
对象。response
对象最大的特点是它是一个WSGI
应用。
在之前介绍WSGI
规范的文章中曾介绍过Web服务器网关
,它简化了服务器和web应用之间的通信过程,它要求服务器和web应用要遵循WSGI
规范进行开发。对于web应用而言,应用应该实现一个函数或者一个可调用对象,这样WSGI
服务器可以通过调用myWebApp(environ, start_response)
从web应用获得响应内容。
response
响应对象就是这样一个WSGI
应用对象。在其实现过程中有一个__call__
方法,可以实现对一个response
对象的调用。代码如下:
1
2
3
4
5
6
7
8
9
10
|
def __call__(self, environ, start_response):
"""Process this response as WSGI application.
:param environ: the WSGI environment.
:param start_response: the response callable provided by the WSGI
server.
:return: an application iterator
"""
app_iter, status, headers = self.get_wsgi_response(environ)
start_response(status, headers)
return app_iter
|
这样,我们就可以很清楚地理解WSGI
应用的实现过程。下面是一个非常简单的WSGI
应用。
1
2
3
4
5
|
from werkzeug.wrappers import Request, Response
def application(environ, start_response):
request = Request(environ)
response = Response("Hello %s!" % request.args.get('name', 'World!'))
return response(environ, start_response)
|
上面的小例子的实现步骤分析:
- 根据传入web应用的
environ
构造请求对象request
; - web应用构造响应对象
response
; - 调用响应对象
response
。调用过程中产生三个值:app_iter
、status
、headers
,其中status
和headers
作为参数传递给函数start_response
用于生成响应报文首行的相关信息,而app_iter
作为响应的内容(它是一个可迭代对象)返回给WSGI网关
; WSGI网关
将返回的信息组成响应首行、响应首部、响应主体等,形成响应报文发回给客户端。
BaseResponse
类中还有一些属性和方法,以下属性和方法的具体用法可以参考Response——werkzeug文档。
- 属性
- status_code
- status
- data
- is_stream
- is_sequence
- ······
- 方法
- call_on_close(func)
- close()
- freeze()
- force_type() 类方法
- from_app() 类方法
- set_data()
- get_data()
_ensure_sequence()
- make_sequence()
- iter_encoded()
- calculate_content_length()
- set_cookie()
- delete_cookie()
- get_wsgi_headers(environ)
- get_app_iter(environ)
- get_wsgi_response(environ)
__call__(environ, start_response)
- ······
Mixin类
BaseRequest
类和BaseResponse
类是请求和响应最基础的类。wrappers
模块中还提供了一些Mixin
类,用于扩展请求类和响应类。
有关请求类的Mixin
类
有关请求类的Mixin
类主要有:
AcceptMixin
类 ——请求报文中关于客户端希望接收的数据类型的类。ETagRequestMixin
类 ——请求报文中关于Etag和Cache的类。UserAgentMixin
类 ——请求报文中关于user_agent的类。AuthorizationMixin
类 ——请求报文中关于认证的类。CommonRequestDescriptorsMixin
类 ——通过这个类可以获取请求首部中的相关信息。
有关响应类的Mixin
类
有关响应类的Mixin
类主要有:
ETagResponseMixin
类 ——为响应增加Etag和Cache控制的类。ResponseStreamMixin
类 ——为响应可迭代对象提供一个“只写”的接口的类。CommonResponseDescriptorsMixin
类 ——通过这个类可以获取响应首部中的相关信息。WWWAuthenticateMixin
类 ——为响应提供认证的类。
Request和Response
终于讲到Request
类和Response
类了。
Request
类继承自BaseRequest
类,并且结合一些请求相关的Mixin
类,具体如下:
1
2
3
|
class Request(BaseRequest, AcceptMixin, ETagRequestMixin,
UserAgentMixin, AuthorizationMixin,
CommonRequestDescriptorsMixin)
|
Response
类继承自BaseResponse
类,并且结合一些响应相关的Mixin
类,具体如下:
1
2
3
|
class Response(BaseResponse, ETagResponseMixin, ResponseStreamMixin,
CommonResponseDescriptorsMixin,
WWWAuthenticateMixin)
|
至此,可以从wrappers
模块中引入Request
类和Response
用于构建请求对象和响应对象。
Werkzeug库——wrappers模块的更多相关文章
- [python标准库]Pickle模块
Pickle-------python对象序列化 本文主要阐述以下几点: 1.pickle模块简介 2.pickle模块提供的方法 3.注意事项 4.实例解析 1.pickle模块简介 The pic ...
- PHP之fopen wrappers模块
一.fopen wrappers模块的配置 ①.allow_url_fopen boolean //出于安全性考虑,此选项只能在 php.ini 中设置 //本选项激活了 URL 形式的 fopen ...
- Python 标准库 ConfigParser 模块 的使用
Python 标准库 ConfigParser 模块 的使用 demo #!/usr/bin/env python # coding=utf-8 import ConfigParser import ...
- Python标准库——collections模块的Counter类
1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...
- 使用不同的C++支持库的模块混合开发时,引发异常展开不正常,抛异常竟引出一个SIGSEGV
如果你使用gcc对一部分模块进行了GNUMake的编译,这些编译出动态库使用在Gradle编译框架下的项目.那么就有可能出现题目中的情况,使用不同的C++支持库的模块混合开发时,引发异常展开不正常. ...
- 20201207-2 openpyxl 库与模块导入
1-1 import openpyxl # 通过文件路径,打开工作簿 wb1 = openpyxl.load_workbook('./demo_excel.xlsx') # 用 Workbook() ...
- Python第三方库(模块)"scikit learn"以及其他库的安装
scikit-learn是一个用于机器学习的 Python 模块. 其主页:http://scikit-learn.org/stable/. GitHub地址: https://github.com/ ...
- python标准库 sysconfig模块
# -*- coding: utf-8 -*-# python:2.x__author__ = 'Administrator'import sysconfig#sysconfig:解释器编译时配置#作 ...
- [python标准库]XML模块
1.什么是XML XML是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.您可以创建内容,然后使用限定标记标记它,从而使每个单词. ...
随机推荐
- leetcode-63-不同路径②
题目描述: 第一次提交: class Solution: def uniquePathsWithObstacles(self, obstacleGrid) : m = len(obstacleGrid ...
- APB简介
一.血缘 AMBA: Advanced Microcontroller Bus Architecture 高级处理器总线架构 AHB: Advanced High-performance Bus 高级 ...
- LUOGU P4159 [SCOI2009]迷路(矩阵乘法)
传送门 解题思路 以前bpw讲过的一道题,顺便复习一下矩阵乘法.做法就是拆点,把每个点拆成\(9\)个点,然后挨个连边.之后若\(i\)与\(j\)之间的边长度为\(x\),就让\(i\)的第\(x\ ...
- html5 js 监听网络在线与离线
<!doctype html> <html> <head> <meta http-equiv="content-type" content ...
- JS 变量的数据类型转换
变量的类型转换,一般情况是JS自动转换的,但也有些时候需要手动转换. 1.其它类型转成布尔型 函数和方法的区别 Boolean(a) //函数是可以独立使用的 document.write(a) ...
- 用原生js封装轮播图
原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不 ...
- 第八篇:ZTree操作总结
花了一个多星期,终于完成了这个完整的功能,今天周五是时候总结下加深理解了. 项目要实现的功能:将树形目录发布到发布库,若是根目录,没有发布,连同自己和下面所有的子目录们全部发布:不是根目录,判断父目录 ...
- 求教各路大神,Fillder的证书一直无法在手机上打开,请教怎么解决
我跟足大神们的设置,软件是Fiddler4,手机是ios12.3.1. FD上该打勾的打勾了,该装证书的也装了,有帖子说重装证书和软件我也都试过,电脑也下了NET Framework 4.7_4.7. ...
- 基础数据类型汇总补充,python集合与深浅拷贝
一.基础数据类型汇总补充 1.查看str所有方法方式 2.列表:在循环中删除元素,易出错或报错(飘红) lis = [11,22,33,44,55] # for i in range(len(lis) ...
- Linux 实用指令(8)--网络配置
目录 网络配置 1 Linux网络配置原理图(含虚拟机) 2 查看网络IP和网关 2.1 查询虚拟网络编辑器 2.2 修改IP地址(修改虚拟网络的IP) 2.3 查看网关 2.4 查看windows环 ...