diff --git a/djblets/cache/backend.py b/djblets/cache/backend.py
index 4bd40a7db7434790181e62e1c651b8ceefbe15c2..48bf17f117db83141b6fddc249aef3b55408b33b 100644
--- a/djblets/cache/backend.py
+++ b/djblets/cache/backend.py
@@ -59,7 +59,8 @@ def _cache_fetch_large_data(cache, key, compress_large_data):
     # generate anything.
     if len(chunks) != chunk_count:
         missing_keys = sorted(set(chunk_keys) - set(chunks.keys()))
-        logger.debug('Cache miss for key(s): %s.' % ', '.join(missing_keys))
+        missing_keys_str = b', '.join(missing_keys).decode('utf-8')
+        logger.debug('Cache miss for key(s): %s.' % missing_keys_str)
 
         raise MissingChunkError
 
@@ -363,7 +364,7 @@ def make_cache_key(key):
             The base key to generate a cache key from.
 
     Returns:
-        unicode:
+        bytes:
         A cache key suitable for use with the cache backend.
     """
     try:
diff --git a/djblets/extensions/loaders.py b/djblets/extensions/loaders.py
index d764a54301af343cb02f23175a6cf851c4e7b2a6..9633db06804bb05c8e2d992ae01f8b431e232cfd 100644
--- a/djblets/extensions/loaders.py
+++ b/djblets/extensions/loaders.py
@@ -66,7 +66,8 @@ class Loader(BaseLoader):
                 The template could not be found.
         """
         try:
-            return manager.resource_string(origin.package, origin.resource)
+            data = manager.resource_string(origin.package, origin.resource)
+            return data.decode('utf-8')
         except Exception:
             raise TemplateDoesNotExist(origin)
 
diff --git a/djblets/util/templatetags/djblets_utils.py b/djblets/util/templatetags/djblets_utils.py
index 219f088e7870d0d3880275c318d71971c12963a5..34c0cae9693ead895f040f5bed77b8b8388fda36 100644
--- a/djblets/util/templatetags/djblets_utils.py
+++ b/djblets/util/templatetags/djblets_utils.py
@@ -25,7 +25,7 @@ from djblets.util.humanize import humanize_list
 register = template.Library()
 
 
-WS_RE = re.compile('\s+')
+WS_RE = re.compile(r'\s+')
 
 
 @register.tag
