#python #django
#python #django
Вопрос:
Я создаю пользовательское исключение, подобное этому:
from django.utils.translation import gettext as _
class File_Upload_Exception(Exception):
pass
def myfn():
raise File_Upload_Exception(_('FILE_TYPE_NOT_ALLOWED'))
Мой вопрос: как мне получить сообщение об исключении? Ниже приведена следующая ошибка: File_Upload_Exception is not JSON serializable
try:
myfn()
except File_Upload_Exception as e:
print(e) #I want to retrieve the message "File type not allowed"
Комментарии:
1. Выдает ошибку : какая ошибка? Включите полную обратную трассировку в свой вопрос.
2. @BoarGules обновил мой вопрос с ошибкой.
3. Я повторяю: полная трассировка .
4. По вашим собственным словам, когда вы пишете
_('FILE_TYPE_NOT_ALLOWED')
, какова цель_
?5. Ваша проблема в том, что объект, возвращаемый функцией отложенного перевода, не является a
string
, как может показаться. Ноdjango.utils.functional.lazy.<locals>proxy
объект, который не является сериализуемым и не может быть отправлен обратно в качестве ответа.
Ответ №1:
Аргументы, которые вы предоставляете в качестве параметров для an Exception
при его создании, доступны в args
атрибуте объекта, который вы получаете при except
создании исключения.
Если вы print()
исключение, Python печатает один параметр сам по себе без кавычек, если был предоставлен только один параметр, или кортеж параметров, если при создании объекта исключения было задано более одного параметра.
class File_Upload_Exception(Exception):
pass
def myfn():
raise File_Upload_Exception('FILE_TYPE_NOT_ALLOWED')
try:
myfn()
except Exception as ex:
print('Printed:', ex)
print(0, ex.args[0])
print()
def myfn2():
raise File_Upload_Exception('FILE_TYPE_NOT_ALLOWED', 'A', 'B')
try:
myfn2()
except Exception as ex:
print('Printed:', ex)
print(0, ex.args[0])
print(1, ex.args[1])
print(2, ex.args[2])
Результат:
Printed: FILE_TYPE_NOT_ALLOWED
0 FILE_TYPE_NOT_ALLOWED
Printed: ('FILE_TYPE_NOT_ALLOWED', 'A', 'B')
0 FILE_TYPE_NOT_ALLOWED
1 A
2 B
Комментарии:
1. Ha! Я думал, что ввел эту опечатку. Так что это вещь Django, а? Ну, это выдает ошибку без какой-либо магии Django, поэтому я ее удалил. Я думаю, что все это все равно будет применяться в любом случае. Это просто вопрос того, что
_('FILE_TYPE_NOT_ALLOWED')
в итоге передается, как вargs
.2. ребята _() — это как строка в django, это строка перевода. Игнорируйте его
3. Я думаю, мы оба это сделали 🙂
4. я не думаю
_()
, что возвращает строку, поэтому вы получаете ошибку5. Нет, это потому, что ‘_’ не определено. Django должен определить это как функцию.
Ответ №2:
Вы были почти там, вы просто делаете так:
def myfn():
raise File_Upload_Exception('File type not allowed')
Вот как вы можете создать пользовательское Exception
исключение в чистом python. Обязательно передайте string
аргументы Exception
class
as .
Следуйте официальной документации для определения пользовательских Exception
исключений django и обработчика ошибок django
Комментарии:
1. В Django нам нужно это глобальное пространство
_
имен, известное как gettext(), поскольку оно не вернет переведенный текст