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