Spec-Zone.ru › Flask 1.0

Контрольные суммы содержимого запроса

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

© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/0.12.x/patterns/requestchecksum/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API