Refactor URL handling to use BASE_URL across the application and add base_url context processor
All checks were successful
Deploy to Server / deploy (push) Successful in 22s
All checks were successful
Deploy to Server / deploy (push) Successful in 22s
This commit is contained in:
parent
999ab368e2
commit
d4fd35769d
11 changed files with 250 additions and 167 deletions
80
core/base_url.py
Normal file
80
core/base_url.py
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import TYPE_CHECKING
|
||||
from urllib.parse import urlsplit
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from django.http import HttpRequest
|
||||
|
||||
|
||||
def _get_base_url() -> str:
|
||||
"""Get normalized BASE_URL from settings.
|
||||
|
||||
Returns:
|
||||
str: The configured BASE_URL without trailing slash.
|
||||
"""
|
||||
base_url = getattr(settings, "BASE_URL", "")
|
||||
return base_url.rstrip("/") if base_url else ""
|
||||
|
||||
|
||||
def build_absolute_uri(
|
||||
location: str | None = None,
|
||||
request: HttpRequest | None = None,
|
||||
) -> str:
|
||||
"""Build an absolute URI via BASE_URL (preferred) or request fallback.
|
||||
|
||||
Args:
|
||||
location: Relative path ('/foo/') or absolute URL.
|
||||
request: Optional HttpRequest to resolve path when location is None.
|
||||
|
||||
Returns:
|
||||
str: Fully resolved absolute URL.
|
||||
"""
|
||||
base_url = _get_base_url()
|
||||
|
||||
if location is None:
|
||||
if request is not None:
|
||||
location = request.get_full_path()
|
||||
else:
|
||||
return f"{base_url}/" if base_url else "/"
|
||||
|
||||
parsed = urlsplit(location)
|
||||
if parsed.scheme and parsed.netloc:
|
||||
return location
|
||||
|
||||
if base_url:
|
||||
if location.startswith("/"):
|
||||
return f"{base_url}{location}"
|
||||
return f"{base_url}/{location.lstrip('/')}"
|
||||
|
||||
if request is not None:
|
||||
return request.build_absolute_uri(location)
|
||||
|
||||
return location
|
||||
|
||||
|
||||
def is_secure() -> bool:
|
||||
"""Return whether the configured BASE_URL uses HTTPS."""
|
||||
base_url = _get_base_url()
|
||||
return base_url.startswith("https://") if base_url else False
|
||||
|
||||
|
||||
@dataclass
|
||||
class _TTVDropsSite:
|
||||
domain: str
|
||||
|
||||
|
||||
def get_current_site(request: object) -> _TTVDropsSite:
|
||||
"""Return a site-like object with domain derived from BASE_URL."""
|
||||
base_url = _get_base_url()
|
||||
parts = urlsplit(base_url)
|
||||
domain = parts.netloc or parts.path
|
||||
return _TTVDropsSite(domain=domain)
|
||||
|
||||
|
||||
def apply_base_url_patches() -> None:
|
||||
"""No-op; use build_absolute_uri() helper explicitly."""
|
||||
return
|
||||
Loading…
Add table
Add a link
Reference in a new issue