W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
許多代碼可以消耗請(qǐng)求數(shù)據(jù)并對(duì)其進(jìn)行預(yù)處理。例如最終出現(xiàn)在已讀取的請(qǐng)求對(duì) 象上的 JSON 數(shù)據(jù)、通過(guò)另外的代碼路徑出現(xiàn)的表單數(shù)據(jù)。當(dāng)你想要校驗(yàn)收到的 請(qǐng)求數(shù)據(jù)時(shí),這似乎帶來(lái)不便。而有時(shí)這對(duì)某些 API 是必要的。
幸運(yùn)的是,無(wú)論如何可以包裝輸入流來(lái)簡(jiǎn)單地改變這種狀況。
下面的例子計(jì)算收到數(shù)據(jù)的 SHA1 校驗(yàn)碼,它從 WSGI 環(huán)境中讀取數(shù)據(jù)并把校驗(yàn) 碼存放到其中:
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
要使用這段代碼,所有你需要做的就是在請(qǐng)求消耗數(shù)據(jù)之前調(diào)用計(jì)算流。(例如: 小心訪問(wèn) request.form 或其它此類(lèi)的東西。例如,應(yīng)注意避免 before_request_handlers 訪問(wèn)它)。
用法示例:
@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
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: