Как проверить с помощью vobject, является ли строка действительной vcard или нет при работе с символами UTF-8?

Как проверить с vobject, является ли строка действительной vcard или нет?

Есть ли какой-нибудь дополнительный метод или общий подход с попыткой и ловлей?

Сейчас я делаю это следующим образом:

 try:
            vobj = vobject.readOne(vcard_readable)
 except Exception as e:
            error_message = {
                "valid": False,
                "reason": "Invalid vCard\n{0}".format(e)}

Как бороться с юникодом с VOBJECT?

2 ответа

Решение

Ваш текущий код работает нормально, но обычно вы не хотите ловить Exception потому что это замаскирует другие ошибки в вашем коде. Например, если я беру ваш фрагмент кода и помещаю его в файл, а затем запускаю его... я не получаю сообщений об ошибках, даже если не импортировал vobject модуль. Это потому, что этот код на самом деле вызывает NameError:

Traceback (most recent call last):
  File "foo.py", line 2, in <module>
    vobj = vobject.readOne(vcard_readable)
NameError: name 'vobject' is not defined

но поскольку вы ловите все исключения, вы это скрываете. Лучшим методом является отлов только тех исключений, которые вы ожидаете получить от vobject модуль, и пусть другие просачиваются нормально.

За vobject, все исключения, которые он поднимает, будут подклассами vobject.base.VObjectError, так что будет достаточно следующего кода:

 try:
            vobj = vobject.readOne(vcard_readable)
 except vobject.base.VObjectError as e:
            error_message = {
                "valid": False,
                "reason": "Invalid vCard\n{0}".format(e)}
 vcard = put.get('vcard')
            try:
                vcard_readable = base64.decodestring(vcard)
                quoted_printable_vcard = quopri.encodestring(vcard_readable)
                vobj = vobject.readOne(quoted_printable_vcard)
            except UnicodeEncodeError as e:  # case of bad encoding
                error_message = {
                    "valid": False,
                    "reason": "Invalid vCard\n{0}".format(e)}
                return HttpResponse(json.dumps(error_message), status=200)
            except vobject.base.VObjectError as e2:  # case of invalid vcard
                error_message = {
                    "valid": False,
                    "reason": "Invalid vCard format\n{0}".format(e2)}
                return HttpResponse(json.dumps(error_message), status=200)
            except:
                error_message = {
                    "valid": False,
                    "reason": "Invalid vCard."}
                return HttpResponse(json.dumps(error_message), status=200)

ХОРОШО. Я решил это. За vobject для работы с UNICODE (UTF-8) необходимо использовать:

quoted printable encoding. - пример того, что это ниже:

>>> s = "gżegżółka"
>>> s
'g\xc5\xbceg\xc5\xbc\xc3\xb3\xc5\x82ka'
>>> import quopri
>>> quopri.encodestring(s)
'g=C5=BCeg=C5=BC=C3=B3=C5=82ka'
Другие вопросы по тегам