itsdangerous 的 "dumps" 方法抛出 TypeError
the "dumps" method of itsdangerous throws a TypeError
我正在遵循『Flask Web 开发』的指南。
我想使用 itsdangerous 生成令牌,但是出现了一些问题。这是我的代码:
def generate_confirmation_token(self, expiration=3600):
s = Serializer(current_app.config['SECRET_KEY'], expiration)
return s.dumps({'confirm': self.id})
self.id
是一个整型对象。
但不幸的是,"dumps" 方法抛出一个 TypeError:
File "/Users/zzx/projects/PycharmProjects/wurong/app/models.py", line 76, in generate_confirmation_token
return s.dumps({'confirm': self.id})
File "/Users/zzx/.pyenv/versions/3.6.1/envs/venv_blog/lib/python3.6/site-packages/itsdangerous.py", line 566, in dumps
rv = self.make_signer(salt).sign(payload)
File "/Users/zzx/.pyenv/versions/3.6.1/envs/venv_blog/lib/python3.6/site-packages/itsdangerous.py", line 353, in sign
return value + want_bytes(self.sep) + self.get_signature(value)
File "/Users/zzx/.pyenv/versions/3.6.1/envs/venv_blog/lib/python3.6/site-packages/itsdangerous.py", line 347, in get_signature
key = self.derive_key()
File "/Users/zzx/.pyenv/versions/3.6.1/envs/venv_blog/lib/python3.6/site-packages/itsdangerous.py", line 333, in derive_key
return self.digest_method(salt + b'signer' +
TypeError: unsupported operand type(s) for +: 'int' and 'bytes'
不知道为什么会出现这个问题,按照我书上的指导就行了~
Serializer
的第二个参数是 salt
,而不是 expiration
。 expiration
根本不是 Serializer
的参数,它是 TimedSerializer.loads
的参数 max_age
。
如果您想要一个过期的令牌,请使用 TimedSerializer
并在您 加载 令牌时传递过期时间,而不是在您创建它时。
def generate_confirmation(self):
s = TimedSerializer(current_app.secret_key, 'confirmation')
return s.dumps(self.id)
def check_confirmation(self, token, max_age=3600):
s = TimedSerializer(current_app.secret_key, 'confirmation')
return s.loads(token, max_age=max_age) == self.id
我正在遵循『Flask Web 开发』的指南。
我想使用 itsdangerous 生成令牌,但是出现了一些问题。这是我的代码:
def generate_confirmation_token(self, expiration=3600):
s = Serializer(current_app.config['SECRET_KEY'], expiration)
return s.dumps({'confirm': self.id})
self.id
是一个整型对象。
但不幸的是,"dumps" 方法抛出一个 TypeError:
File "/Users/zzx/projects/PycharmProjects/wurong/app/models.py", line 76, in generate_confirmation_token
return s.dumps({'confirm': self.id})
File "/Users/zzx/.pyenv/versions/3.6.1/envs/venv_blog/lib/python3.6/site-packages/itsdangerous.py", line 566, in dumps
rv = self.make_signer(salt).sign(payload)
File "/Users/zzx/.pyenv/versions/3.6.1/envs/venv_blog/lib/python3.6/site-packages/itsdangerous.py", line 353, in sign
return value + want_bytes(self.sep) + self.get_signature(value)
File "/Users/zzx/.pyenv/versions/3.6.1/envs/venv_blog/lib/python3.6/site-packages/itsdangerous.py", line 347, in get_signature
key = self.derive_key()
File "/Users/zzx/.pyenv/versions/3.6.1/envs/venv_blog/lib/python3.6/site-packages/itsdangerous.py", line 333, in derive_key
return self.digest_method(salt + b'signer' +
TypeError: unsupported operand type(s) for +: 'int' and 'bytes'
不知道为什么会出现这个问题,按照我书上的指导就行了~
Serializer
的第二个参数是 salt
,而不是 expiration
。 expiration
根本不是 Serializer
的参数,它是 TimedSerializer.loads
的参数 max_age
。
如果您想要一个过期的令牌,请使用 TimedSerializer
并在您 加载 令牌时传递过期时间,而不是在您创建它时。
def generate_confirmation(self):
s = TimedSerializer(current_app.secret_key, 'confirmation')
return s.dumps(self.id)
def check_confirmation(self, token, max_age=3600):
s = TimedSerializer(current_app.secret_key, 'confirmation')
return s.loads(token, max_age=max_age) == self.id