私は古いプロジェクトに取り組んでおり、Python 3、特に3.4を試してみることにしました。Python 2.7から3.4への移行トークンジェネレータのエンコーディング
私はPyramidフレームワークを構築しており、認証目的でランダム化を生成する必要があります。以前は、ユーザーIDにランダムなビットを追加しましたが、すべて正常でしたが、Python 3ではエンコーディングに問題があります。
これは私がそれを行うために使用される方法です:
from base64 import b64encode, b64decode
from Crypto.Hash import HMAC, SHA
def create_token(request, username):
r = uuid4().hex + b64encode(json.dumps({'username': username}))
sig = HMAC.new(secret, r.encode('UTF-8'), SHA).hexdigest()
return u"{}{}".format(sig, r)
しかし、今、私はエラーを取得する:
File "/security.py", line 30, in create_token
r = uuid4().hex + b64encode(json.dumps({'username': username}))
File "/.pyenv/versions/3.4.0/lib/python3.4/base64.py", line 63, in b64encode
encoded = binascii.b2a_base64(s)[:-1]
TypeError: 'str' does not support the buffer interface
だから私は、ユーザー名をエンコードしようとした、と私は
TypeError: b'admin' is not JSON serializable
を取得
エンコーダはバイトを要求し、JSONは文字列を要求しますが、これをPython 3でどのようにすることができますか?
あなたのトレースバックが投稿された機能と一致しません。たとえば、投稿されたコードには「userid」はありません。 –
あなたのユーザIDをむしろ – Niel
に変更しました。それでもあなたのトレースバックは一致しません。トレースバックの 'userid'行は、それが複数行にわたる大きな辞書ステートメントの一部であるように見えます。 –