Метод "dumps" его опасных бросков выдает TypeError

Я следую руководству "Flask Web Development".
Я хочу использовать его для генерации токена, но возникли некоторые проблемы. Вот мой код:

def generate_confirmation_token(self, expiration=3600):
    s = Serializer(current_app.config['SECRET_KEY'], expiration)
    return s.dumps({'confirm': self.id})

self.id является объектом int.

Но, к сожалению, метод "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'

Я не знаю, почему возникла эта проблема, я просто следую инструкциям моей книги ~

2 ответа

Решение

Второй аргумент 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

Ваш код верен, но вы импортируете неправильный сериализатор . Вы, наверное, поставили автоимпорт и не заметили этого.

      from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

[Примечание] : В последней опасной версии TimedJSONWebSignatureSerializer больше недоступен. Если вы хотите продолжать использовать его таким образом, вы можете понизить версию

/questions/63641629/importerror-nevozmozhno-importirovat-imya-timedjsonwebsignatureserializer-iz-its/64173414#64173414

Другие вопросы по тегам