Извлечение переведенного текста пользовательского исключения в Django

#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(), поскольку оно не вернет переведенный текст