Контрольные суммы содержимого запроса¶
Различные части кода могут потреблять данные запроса и предварительно обрабатывать их. Например, данные 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}"