也许你经常需要对你的的应用进行单元测试或者仅仅检查 Python session 的输出。理论上 讲这是很简单的,你可以伪造一个环境,通过一个假的 start_response 遍历应用,但是 这里还有一个更好的方法。
Werkzeug 提供了一个 Client 对象,可以传入一个 WSGI 应用(可选传入一个 response), 通过这个你可以向应用发出一个虚拟请求。
用三个参数调用一个 response: 应用迭代器、状态和一个 headers。默认 response 返回 一个元组。因为 response 对象有相同的签名,所以你可以像使用 response 一样使用他们 。通过这样一种方式进行测试功能是很理想的。
>>> from werkzeug.test import Client
>>> from werkzeug.testapp import test_app
>>> from werkzeug.wrappers import BaseResponse
>>> c = Client(test_app, BaseResponse)
>>> resp = c.get('/')
>>> resp.status_code
200
>>> resp.headers
Headers([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '8339')])
>>> resp.data.splitlines()[0]
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"'
或默认没有 response:
>>> c = Client(test_app)
>>> app_iter, status, headers = c.get('/')
>>> status
'200 OK'
>>> headers
[('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '8339')]
>>> ''.join(app_iter).splitlines()[0]
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"'
0.5 新版功能.
交互测试应用 最简单的方法是使用 EnvironBuilder 类。它可以创建标准 WSGI 环境和请求对象。
下面的例子创建了一个上传文件和文件表单的 WSGI 环境:
>>> from werkzeug.test import EnvironBuilder
>>> from StringIO import StringIO
>>> builder = EnvironBuilder(method='POST', data={'foo': 'this is some text',
... 'file': (StringIO('my file contents'), 'test.txt')})
>>> env = builder.get_environ()
返回的环境是一个新的 WSGI 环境,可用于进一步的处理:
>>> from werkzeug.wrappers import Request
>>> req = Request(env)
>>> req.form['foo']
u'this is some text'
>>> req.files['file']
<FileStorage: u'test.txt' ('text/plain')>
>>> req.files['file'].read()
'my file contents'
当你将一个字典传给构造函数数据, EnvironBuilder 会自动自动找出内容类型。如 过你传的似乎一个字符串或者输入字符流,你不得不自己来做这些处理。
默认地它将会尝试使用 application/x-www-form-urlencoded ,如果文件被上传则只 使用 multipart/form-data :
>>> builder = EnvironBuilder(method='POST', data={'foo': 'bar'})
>>> builder.content_type
'application/x-www-form-urlencoded'
>>> builder.files['foo'] = StringIO('contents')
>>> builder.content_type
'multipart/form-data'
如果传入一个字符串(或一个输入流),你必须自己指定内容的类型:
>>> builder = EnvironBuilder(method='POST', data='{"json": "this is"}')
>>> builder.content_type
>>> builder.content_type = 'application/json'
这个类为了测试可以方便的创建一个 WSGI 环境。他可以从任意数据快速创建 WSGI 环境或请求对象。
这个类的签名也可用于 Werkzeug 的其他地方(create_environ(), BaseResponse.from_values(), Client.open())。因为大多数功能只可通 过构造函数实现。
文件和表格数据可以被各自的 form 和 files 属性独立处理。但是以 相同的参数传入构造函数:data。
data 可以是这些值:
0.6 新版功能: path 和 base_url 现在是 unicode 字符串,它可以使用 iri_to_uri() 函数编码。
参数: |
|
---|
应用的地址。(又叫 PATH_INFO)
编码 unicode 数据的字符集。
一个带着请求 headers的 Headers 对象。
用于 wsgi.errors 流的错误流。
wsgi.multithread 的值。
wsgi.multiprocess 的值。
新创建环境的基本字典。
用于覆盖生成环境的带值字典。
可选选项输入流。这个和 form / files 是相互独立的。同时如果 请求方法不是 POST / PUT 或其他类似方法,不要提供输入流。
URL 参数是 MultiDict。
base URL 是一个用于提取 WSGI URL ,主机(服务器名 + 服务器端口) 和根脚本 (SCRIPT_NAME) 的 URL
关闭所有文件。如果把 file 对象放入 files 字典,你可 以通过调用这个方法自动关闭他们。
返回内置环境。
返回一个带数据的请求。如果没有指定请求类,将会是用 request_class。
参数: | cls – 使用 request 包装。 |
---|
一个可选的输入流。如果你设置它,将会清空 form 和 files。
默认的请求类 get_request()。
BaseRequest 的别名
服务器名 (只读, 使用 host 设置)
整型服务器接口(只读,使用 host 设置)
服务器使用协议。默认为 HTTP/1.1
使用的 WSGI 版本。默认为(1, 0)。
这个类允许你发送请求给一个包裹的应用。
响应可以是一个类或者一个有三个参数工厂函数: app_iter, status and headers。默 认的响应仅仅是一个元组。
例如:
class ClientResponse(BaseResponse):
...
client = Client(MyApplication(), response_wrapper=ClientResponse)
use_cookies 参数默认是开启的,无论 cookies 是否被存储,他都会和请求一起传输。 但是你也可以关闭 cookie。
如果你想要请求应用的子域名,你可以设置 allow_subdomain_redirects 为 True , 如果为 False ,将不允许外部重定向。
0.5 新版功能: use_cookies 是在这个版本添加的。老版本不提供内置 cookie 支持。
和 EnvironBuilder 一样的参数还有一些补充: 你可以提供一个 EnvironBuilder 类或一个 WSGI 环境代替 EnvironBuilder 类作为参数。同时有两个可选参数 (as_tuple, buffered),可以改变返回值 的类型或应用执行方法。
在 0.5 版更改: 如果为 data 参数提供一个带文件的字典,那么内容类型必须为 content_type 而不是 mimetype。这个改变是为了和 werkzeug.FileWrapper 保 持一致。
follow_redirects 参数被添加到 open().
Additional parameters:
参数: |
|
---|
和 open 相似,但是方法强制执行 GET。
和 open 相似,但是方法强制执行 POST。
和 open 相似,但是方法强制执行 PUT。
和 open 相似,但是方法强制执行 DELETE。
和 open 相似,但是方法强制执行 HEAD。
根据传入的值创建一个 WSGI 环境。第一个参数应该是请求的路径,默认为 ‘/’。 另一个参数或者是一个绝对路径(在这个例子中主机是 localhost:80)或请求的完整 路径,端口和脚本路径。
它和 EnvironBuilder 构造函数接受相同的参数。
在 0.5 版更改: 这个函数现在是一个 EnvironBuilder 包裹,在 0.5 版本被添加。需要 headers, environ_base, environ_overrides 和 charset 参数。
返回一个应用输出的元组形式 (app_iter, status, headers)。如果你通过应用 返回一个迭代器他将会工作的更好。
有时应用可以使用 start_ewsponse 返回的 write() 回调函数。这将会自动解 决边界情况。如果没有得到预期输出,你应该将 buffered 设为 True 执行 buffering
如果传入一个错误的应用,这个函数将会是未定义的。不要给这个函数传入一个不标准 的 WSGI 应用。
参数: |
|
---|---|
返回: | 元组形式 (app_iter, status, headers) |