From 8f9165bfed406b485eea790f9dc834c9794fa0d4 Mon Sep 17 00:00:00 2001 From: Julien BERNARD Date: Mon, 14 Nov 2022 21:08:09 -0500 Subject: [PATCH] Move idna import to module level --- django/utils/encoding.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/django/utils/encoding.py b/django/utils/encoding.py index 700e051f35..085f9a71dd 100644 --- a/django/utils/encoding.py +++ b/django/utils/encoding.py @@ -6,6 +6,12 @@ from urllib.parse import quote from django.utils.functional import Promise +try: + # try importing idna package for IDNA 2008 compliance + import idna +except ImportError: + idna = None + class DjangoUnicodeDecodeError(UnicodeDecodeError): def __init__(self, obj, *args): @@ -213,17 +219,15 @@ def punycode(domain): """Return the Punycode of the given domain if it's non-ASCII.""" if not domain: return domain - try: - # try importing idna package for IDNA 2008 compliance - import idna + if idna: + try: + # enable uts46 mapping for mapping: uppercase letters, normalization, etc. + return idna.encode(domain, uts46=True, transitional=False).decode("ascii") + except idna.IDNAError as e: + raise UnicodeError(e) from e - # enable uts46 mapping for mapping: uppercase letters, normalization, etc. - return idna.encode(domain, uts46=True, transitional=False).decode("ascii") - except ImportError: - # will fall back to Python IDNA 2003 - return domain.encode("idna").decode("ascii") - except idna.IDNAError as e: - raise UnicodeError(e) from e + # will fall back to Python IDNA 2003 + return domain.encode("idna").decode("ascii") def repercent_broken_unicode(path):