コンテンツチェックサムのリクエスト—フラスコのドキュメント

提供:Dev Guides
< FlaskFlask/docs/1.1.x/patterns/requestchecksum
移動先:案内検索

コンテンツチェックサムのリクエスト

さまざまなコードがリクエストデータを消費して前処理する可能性があります。 たとえば、JSONデータは、すでに読み取られて処理されたリクエストオブジェクトに到達し、フォームデータもそこに到達しますが、別のコードパスを通過します。 着信リクエストデータのチェックサムを計算する場合、これは不便に思えます。 これは、一部のAPIで必要になる場合があります。

ただし、幸いなことに、これは入力ストリームをラップすることで変更するのは非常に簡単です。

次の例では、受信データが読み取られてWSGI環境に保存されるときに、受信データのSHA1チェックサムを計算します。

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