- Wrap RateLimitMiddleware in Middleware() - bare class broke all requests (500) - Clamp/validate num param - ?num=abc no longer returns 500 - Query length cap (500), result counts clamped to 1..20 - Wire lifespan into Starlette so shared httpx client closes on shutdown - Purge stale per-IP rate limit entries to bound memory growth - URL-encode queries in the Playwright scraper path - Lazy lib imports so the package works without optional playwright - Add pyproject.toml (activates ruff/pytest/bandit in CI), README, LICENSE - Remove committed __pycache__, add .gitignore/.dockerignore - Fix SearXNG healthcheck path (/health -> /healthz) and compose docs
26 lines
766 B
Python
26 lines
766 B
Python
"""Shared search utilities.
|
|
|
|
Playwright-based scrapers are imported lazily so the package (and its
|
|
rate limiter) works without the optional ``playwright`` dependency.
|
|
"""
|
|
|
|
from lib.rate_limiter import RateLimiter
|
|
|
|
__all__ = ["PlaywrightManager", "RateLimiter", "GoogleSearch", "DuckDuckGoSearch"]
|
|
|
|
|
|
def __getattr__(name):
|
|
if name == "PlaywrightManager":
|
|
from lib.playwright_manager import PlaywrightManager
|
|
|
|
return PlaywrightManager
|
|
if name == "GoogleSearch":
|
|
from lib.google_search import GoogleSearch
|
|
|
|
return GoogleSearch
|
|
if name == "DuckDuckGoSearch":
|
|
from lib.duckduckgo_search import DuckDuckGoSearch
|
|
|
|
return DuckDuckGoSearch
|
|
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|