请求内容校验¶
各种代码片断中可以消耗请求数据和处理它。比如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