#python #django
#python #django
Вопрос:
Я нашел этот блок кода, который создает экземпляр класса с объектом, но мы использовали его как вызываемый даже без определения __call__
метода. Вот код класса в Django, исходный код на Github, код класса
Вы также можете увидеть создание экземпляра внизу страницы, и здесь мы использовали его, унаследовав от него:
class TokenGenerator(PasswordResetTokenGenerator):
def _make_hash_vlaue(self, user, timestamp):
return (str(user.pk) str(timestamp) str(user.is_active))
account_activation_token = TokenGenerator()
Вот вызов созданного экземпляра в ключе токена словаря:
message = render_to_string('acc_activate_email.html',
{'user': new_user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(new_user.pk),
'token': account_activation_token(new_user))})
Вы можете взглянуть на исходный код здесь
исходный код, в котором мы использовали объект
Комментарии:
1. Это все равно приведет к сбою, потому что вы передаете только
user
, а неtimestamp
Ответ №1:
Возможно, ваш вопрос был задан до вышеупомянутого кода из статьи, но фактический код сейчас
'token':account_activation_token.make_token(user),
что было бы правильным вызовом make_token
метода. С кодом, который вы вставили выше, вызов account_activation_token(user)
вызовет ошибку `TypeError: объект ‘TokenGenerator’ не вызывается.
Комментарии:
1. да, это то, что произошло, когда я попытался сделать это похожим на то, что он сделал, я думал, что это из-за меня, поскольку многие люди прокомментировали, не упомянув об этом
Ответ №2:
Вы можете сделать это с __call__
методом в классе:
class TokenGenerator(PasswordResetTokenGenerator):
def make_token(self, user, timestamp):
return (str(user.pk) str(timestamp) str(user.is_active))
def __call__(self, user, password):
return self.make_token(user, timestamp)
t = TokenGenerator()
t(someuser, sometimestamp)
# some hash
Однако я не совсем уверен, что вам это нужно, поскольку у вас есть класс, в котором make_token
метод вообще ни на что не ссылается в классе. Функция сделала бы здесь то же самое:
generate_token(user, timestamp):
return (str(user.pk) str(timestamp) str(user.is_active))
generate_token(someuser, sometimestamp)
# some hash
На самом деле, способ, которым они используют его в документах, заключается в вызове этого метода экземпляра из экземпляра, подобного:
t = TokenGenerator()
t._make_hash_vlaue(someuser, sometimestamp)
Комментарии:
1. я действительно ценю это, я просто хотел узнать, что происходит с кодом, как сказал мне @mcabrams, большое спасибо