请求内容校验和 — Flask 文档

来自菜鸟教程
Flask/docs/1.1.x/patterns/requestchecksum
跳转至:导航、​搜索

请求内容校验和

各种代码可以使用请求数据并对其进行预处理。 例如,JSON 数据在已经读取和处理的请求对象上结束,表单数据也在那里结束,但通过不同的代码路径。 当您要计算传入请求数据的校验和时,这似乎很不方便。 这对于某些 API 有时是必要的。

幸运的是,这很容易通过包装输入流来改变。

以下示例计算传入数据的 SHA1 校验和,因为它被读取并将其存储在 WSGI 环境中:

import hashlib

class ChecksumCalcStream(object):

    def __init__(self, stream):
        self._stream = stream
        self._hash = hashlib.sha1()

    def read(self, bytes):
        rv = self._stream.read(bytes)
        self._hash.update(rv)
        return rv

    def readline(self, size_hint):
        rv = self._stream.readline(size_hint)
        self._hash.update(rv)
        return rv

def generate_checksum(request):
    env = request.environ
    stream = ChecksumCalcStream(env['wsgi.input'])
    env['wsgi.input'] = stream
    return stream._hash

要使用它,您需要做的就是在请求开始使用数据之前挂钩计算流。 (例如:小心访问 request.form 或任何类似的东西。 before_request_handlers 例如应该小心不要访问它)。

用法示例:

@app.route('/special-api', methods=['POST'])
def special_api():
    hash = generate_checksum(request)
    # Accessing this parses the input stream
    files = request.files
    # At this point the hash is fully constructed.
    checksum = hash.hexdigest()
    return 'Hash was: %s' % checksum