API 级别 — Werkzeug 文档

来自菜鸟教程
Werkzeug/docs/2.0.x/levels
跳转至:导航、​搜索

API 级别

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

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

例子

这个例子实现了一个小的 Hello World 应用程序,它用输入的名字迎接用户。

from html 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 html 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 中间件。