请求内容校验和¶
各种代码可以消耗请求数据并对其进行预处理。例如,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 f"Hash was: {checksum}"