API等级

Werkzeug旨在成为一个实用程序而非框架。因此,用户友好的API与较低级别的API分离,以便可以轻松地使用Werkzeug扩展另一个系统。

所有功能 RequestResponse 对象(也称为“包装器”)提供的功能也可以在小型实用程序中使用。

例子

这个例子实现了一个 Hello World 用输入的名称与用户打招呼的应用程序。

from markupsafe import escape
from werkzeug.wrappers import Request, Response

@Request.application
def hello_world(request):
    result = ['<title>Greeter</title>']
    if request.method == 'POST':
        result.append(f"<h1>Hello {escape(request.form['name'])}!</h1>")
    result.append('''
        <form action="" method="post">
            <p>Name: <input type="text" name="name" size="20">
            <input type="submit" value="Greet me">
        </form>
    ''')
    return Response(''.join(result), mimetype='text/html')

或者,可以在没有请求和响应对象的情况下使用相同的应用程序,但可以利用Werkzeug提供的解析函数:

from markupsafe import escape
from werkzeug.formparser import parse_form_data

def hello_world(environ, start_response):
    result = ['<title>Greeter</title>']
    if environ['REQUEST_METHOD'] == 'POST':
        form = parse_form_data(environ)[1]
        result.append(f"<h1>Hello {escape(form['name'])}!</h1>")
    result.append('''
        <form action="" method="post">
            <p>Name: <input type="text" name="name" size="20">
            <input type="submit" value="Greet me">
        </form>
    ''')
    start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')])
    return [''.join(result).encode('utf-8')]

高还是低?

通常您希望使用高级层(请求和响应对象)。但有些情况下,这可能不是你想要的。

例如,您可能正在维护用Django或其他框架编写的应用程序的代码,并且您必须解析HTTP头。您可以通过访问较低级别的HTTP头解析函数来利用Werkzeug。

另一种低级解析函数可能有用的情况是定制的wsgi框架、单元测试或将旧的cgi/mod_python应用程序现代化到wsgi以及希望降低开销的wsgi中间件。