我正在寫用戶註冊我自己的驗證碼系統。所以我需要創建一個合適的URL來接收生成的驗證碼圖片。代看起來像這樣:Django的urlsafe base64解密與解密
_cipher = cipher.new(settings.CAPTCHA_SECRET_KEY, cipher.MODE_ECB)
_encrypt_block = lambda block: _cipher.encrypt(block + ' ' * (_cipher.block_size - len(block) % _cipher.block_size))
#...
a = (self.rightnum, self.animal_type[1])
serialized = pickle.dumps(a)
encrypted = _encrypt_block(serialized)
safe_url = urlsafe_b64encode(encrypted)
但後來我想接收通過視圖功能GET請求該鍵,它失敗在urlsafe_b64decode()與「字符映射必須返回整數,無或Unicode」的錯誤:
def captcha(request):
try:
key = request.REQUEST['key']
decoded = urlsafe_b64decode(key)
decrypted = _decrypt_block(decoded)
deserialized = pickle.loads(decrypted)
return HttpResponse(deserialized)
except KeyError:
return HttpResponseBadRequest()
我發現,urlsafe_b64encode的輸出有一個海峽,但GET請求返回一個Unicode對象(不過這是一個正確的字符串)。 Str()沒有幫助(它在django內部深處返回解碼錯誤),並且如果我使用密鑰。 repr它的工作原理,但解密器不會出現錯誤「輸入字符串的長度必須是16的倍數」。 在一個測試文件裏面,所有這些構造完美地工作,我不明白,有什麼不對?
是否需要加密?無法生成驗證碼在會話數據服務器端存儲正確答案?或者你想避免這種情況? – MattH
只是沒有考慮到它。但是這個問題很有趣,我想了解它爲什麼會發生。 – Enchantner
'key = str(request.REQUEST ['key'])'不起作用? – MattH