請求內容校驗碼

各種程式碼可能會消耗請求資料並預先處理它。例如,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}"