#python #django
#python #django
Вопрос:
Это не всегда этот фрагмент кода, но это самый последний. Кажется, это случайно, какие-нибудь мысли?
try:
u = User.objects.get(email__iexact=useremail)
except User.DoesNotExist:
...
Выдает эту ошибку случайным образом.
File "/srv/myapp/registration/models.py", line 23, in get_or_create_user
u = User.objects.get(email__iexact=useremail)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 132, in get
return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 349, in get
% self.model._meta.object_name)
TypeError: ‘DoesNotExist’ object is not callable
Комментарии:
1. Похоже, вы где-то выполняете неправильное назначение.
2. Действительно. В опубликованном вами фрагменте нет ничего «неправильного». Что-то где-то еще вызывает проблему.
3. Есть мысли о том, как это отследить? Как я уже сказал, дело не только в этом коде, но, похоже, это происходит в том же модальном режиме. Мы не можем его реплицировать, поэтому отладка была невозможна.
4. Можете ли вы опубликовать полный код? Я думаю, что после вашего блока try / catch вы используете эту переменную u со значением объекта DoesNotExist. Возможно, вам нужно будет установить в except значение None .
5. Это не просто этот фрагмент кода, это происходило в разных частях приложения в случайное время. Другая запутанная часть, поскольку этот код работал нормально в течение нескольких месяцев, и внезапно мы получаем эти ошибки.
Ответ №1:
Как говорит Крис в комментариях выше, ваш фрагмент является действительным. Где-то еще в вашем коде вы можете неправильно перехватывать исключения.
У вас может быть что-то вроде:
try:
do_something()
except User.MultipleObjectsReturned, User.DoesNotExist:
pass
вместо:
try:
do_something()
except (User.MultipleObjectsReturned, User.DoesNotExist):
pass
Без круглых скобок оператор except эквивалентен следующему в Python 2.6
except User.MultipleObjectsReturned as User.DoesNotExist:
Экземпляр User.MultipleObjectsReturned
исключения перезаписывается User.DoesNotExist
.
Когда позже тот же процесс обрабатывает другой запрос, вы получаете TypeError
потому, что ваш код пытается вызвать экземпляр исключения, который был заменен User.DoesNotExist
.
Комментарии:
1. Это кажется вероятным кандидатом
2. ПОТРЯСАЮЩЕ! Спасибо, быстрый grep для всех DoesNotExists показал виновника. кроме ключа входа. DoesNotExist, User.DoesNotExist:
3. Да, это полностью устранило проблему, которая беспокоила меня месяцами. Я только что нашел в своем проекте «DoesNotExist», чтобы увидеть, где я мог забыть скобки. Спасибо!
4. Спасибо вам оооочень, очень, очень большое! Я бы никогда не подумал об этом.
5. Спасибо! Сделал мою ночь. Я часами смотрел на этот странный сбой теста.