searxng/searxng · error · ValueError
resolver {fqn} is not implemented
Error message
resolver {fqn} is not implemented What it means
favicon proxy resolves a resolver by fully-qualified name from config (fqn) via importlib; if the imported module lacks the attribute, getattr returns None and ValueError is raised. (Note: for a truly missing attribute getattr raises AttributeError instead; None means the attribute exists but is set to None.)
Source
Thrown at searx/favicons/proxy.py:80
resolver_map: dict[str, str] = msgspec.field(default_factory=_initial_resolver_map)
"""The resolver_map is a key / value dictionary where the key is the name of
the resolver and the value is the fully qualifying name (fqn) of resolver's
function (the callable). The resolvers from the python module
:py:obj:`searx.favicons.resolver` are available by default."""
def get_resolver(self, name: str) -> Callable | None:
"""Returns the callable object (function) of the resolver with the
``name``. If no resolver is registered for the ``name``, ``None`` is
returned.
"""
fqn = self.resolver_map.get(name)
if fqn is None:
return None
mod_name, _, func_name = fqn.rpartition('.')
mod = importlib.import_module(mod_name)
func = getattr(mod, func_name)
if func is None:
raise ValueError(f"resolver {fqn} is not implemented")
return func
favicon_path: str = get_setting("ui.static_path") + "/themes/{theme}/img/empty_favicon.svg" # type: ignore
favicon_mime_type: str = "image/svg+xml"
def favicon(self, **replacements):
"""Returns pathname and mimetype of the default favicon."""
return (
pathlib.Path(self.favicon_path.format(**replacements)),
self.favicon_mime_type,
)
def favicon_data_url(self, **replacements):
"""Returns data image URL of the default favicon."""
cache_key = ", ".join(f"{x}:{replacements[x]}" for x in sorted(list(replacements.keys()), key=str))
data_url = DEFAULT_FAVICON_URL.get(cache_key)
if data_url is not None:View on GitHub (pinned to 9fea41204f)
Solutions
- Verify the dotted path in your favicons config points to an existing function (check searx.favicons.resolvers module)
- Fix typos in module/class names
- Set the resolver key to null to use the default behavior
Defensive patterns
Strategy: validation
Validate before calling
import importlib
mod_name, _, fn = fqn.rpartition('.')
obj = getattr(importlib.import_module(mod_name), fn, None)
if not callable(obj):
print('bad resolver fqn') Type guard
def is_valid_resolver(fqn: str) -> bool:
mod_name, _, fn = fqn.rpartition('.')
try:
return callable(getattr(importlib.import_module(mod_name), fn, None))
except ImportError:
return False Try / catch
try:
get_resolver(fqn)
except (ValueError, AttributeError, ImportError) as e:
logger.error('favicon resolver %s invalid: %s', fqn, e) Prevention
- Use FQNs of bundled resolvers from searx.favicons.resolvers
- Test custom resolvers import standalone before config
When it happens
Trigger: Configuring favicons.resolver or a strategy's favicon resolver to a dotted path where the symbol resolves to None (e.g. a placeholder or misspelled function that was renamed to None).
Common situations: Custom resolver modules, typos in FQNs, or version changes that renamed resolver functions.
Related errors
- favicons db_type '{cfg.db_type}' is unknown
- config schema version {CONFIG_SCHEMA} is needed, version {sc
- invalid setting ext: {zlib_ext}
- invalid setting year_from: {zlib_year_from}
- invalid setting year_to: {zlib_year_to}
AI-assisted analysis of searxng/searxng@9fea41204f (2026-08-27).
Data as JSON: /api/errors/1b17619113f5f4fd.
Report an issue: GitHub.