Add function to build canonical url

This commit is contained in:
Nyymix 2025-08-05 20:40:03 +03:00
parent e8d73b9909
commit b59377471a
6 changed files with 87 additions and 41 deletions

View file

@ -15,6 +15,8 @@ ALLOWED_HOSTS = []
INTERNAL_IPS = ['localhost', '127.0.0.1',] INTERNAL_IPS = ['localhost', '127.0.0.1',]
CANONICAL_URL_DOMAIN = "https://nyymix.net"
# Localization # Localization
LANGUAGES = [ LANGUAGES = [
@ -32,9 +34,6 @@ LOCALE_PATHS = [
BASE_DIR / 'locale', BASE_DIR / 'locale',
] ]
# Hostname for canonical_url
CANONICAL_HOST = "nyymix.net"
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
@ -79,7 +78,6 @@ TEMPLATES = [
'django.template.context_processors.request', 'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth', 'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages', 'django.contrib.messages.context_processors.messages',
'gallery.context_processors.canonical_url_processor',
], ],
}, },
}, },

View file

@ -1,10 +0,0 @@
from django.conf import settings
def canonical_url_processor(request):
if settings.DEBUG:
canonical_url = request.build_absolute_uri()
else:
canonical_host = settings.CANONICAL_HOST
canonical_url = f"{request.scheme}://{canonical_host}{request.get_full_path()}"
return {'canonical_url': canonical_url}

31
gallery/utils.py Normal file
View file

@ -0,0 +1,31 @@
from urllib.parse import urlencode, urlparse, urlunparse
from django.conf import settings
from django.urls import reverse
def build_canonical_url(request, base_url=None, params=None):
if base_url is None:
base_url = request.path
elif base_url.startswith('/'):
base_url = base_url
else:
parsed = urlparse(base_url)
base_url = parsed.path + ('?' + parsed.query if parsed.query else '')
filtered_params = {
k: v for k, v in (params or {}).items()
if v not in (None, '', [], {}) and not (k == 'page' and str(v) == '1')
}
query_string = urlencode(filtered_params)
path = base_url
if query_string:
path += '?' + query_string
domain = getattr(settings, 'CANONICAL_URL_DOMAIN', None)
if domain:
return domain.rstrip('/') + path
return request.build_absolute_uri(path)

View file

@ -3,13 +3,14 @@ from django.core.cache import cache
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.db.models import Count, F, Q, Sum from django.db.models import Count, F, Q, Sum
from django.http import JsonResponse from django.http import JsonResponse
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404
from django.urls import reverse from django.urls import reverse
from django.views import View from django.views import View
from django.views.generic import DetailView, ListView, TemplateView from django.views.generic import DetailView, ListView, TemplateView
from config.cache_durations import * from config.cache_durations import *
from gallery.cache import cached_or_set from gallery.cache import cached_or_set
from gallery.utils import build_canonical_url
from ..models import Album, Photo, Redir from ..models import Album, Photo, Redir
@ -45,11 +46,11 @@ class AlbumsList(ListView):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
page_obj = context.get('page_obj') page_obj = context.get('page_obj')
page = self.request.GET.get('page') canonical_url = build_canonical_url(
if page_obj.number > 1: self.request,
canonical_url = f"{self.request.build_absolute_uri(reverse('gallery:albums_url'))}?page={page}" reverse('gallery:albums_url'),
else: params={'page': page_obj.number}
canonical_url = self.request.build_absolute_uri(reverse('gallery:albums_url')) )
context.update({ context.update({
'canonical_url': canonical_url, 'canonical_url': canonical_url,
@ -75,10 +76,11 @@ class AlbumDetail(DetailView):
page_obj = paginator.get_page(self.request.GET.get('page')) page_obj = paginator.get_page(self.request.GET.get('page'))
# Canonical_url # Canonical_url
if page_obj.number > 1: canonical_url = build_canonical_url(
canonical_url = f"{self.request.build_absolute_uri(self.object.get_absolute_url())}?page={page_obj.number}" self.request,
else: self.object.get_absolute_url(),
canonical_url = self.request.build_absolute_uri(self.object.get_absolute_url()) params={'page': page_obj.number}
)
context.update({ context.update({
'photos': page_obj.object_list, 'photos': page_obj.object_list,
@ -110,12 +112,11 @@ class AlbumSearch(TemplateView):
page_obj = paginator.get_page(self.request.GET.get('page')) page_obj = paginator.get_page(self.request.GET.get('page'))
# Canonical URL # Canonical URL
page = self.request.GET.get('page') canonical_url = build_canonical_url(
base_url = self.request.build_absolute_uri(reverse('gallery:search_url')) self.request,
if page_obj.number > 1: reverse('gallery:search_url'),
canonical_url = f"{base_url}?page={page}" params={'page': page_obj.number, 'q': query}
else: )
canonical_url = base_url
context.update({ context.update({
'results': page_obj.object_list, 'results': page_obj.object_list,
@ -124,4 +125,5 @@ class AlbumSearch(TemplateView):
'is_paginated': page_obj.has_other_pages(), 'is_paginated': page_obj.has_other_pages(),
'canonical_url': canonical_url 'canonical_url': canonical_url
}) })
return context return context

View file

@ -11,6 +11,8 @@ from django.urls import reverse
from django.views import View from django.views import View
from django.views.generic import DetailView, ListView, TemplateView from django.views.generic import DetailView, ListView, TemplateView
from gallery.utils import build_canonical_url
from ..models import Album, Photo, Redir from ..models import Album, Photo, Redir
@ -20,8 +22,14 @@ class Main(TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['canonical_url'] = self.request.build_absolute_uri(reverse('gallery:main_url')) canonical_url = build_canonical_url(
context['latest_albums'] = Album.objects.filter(is_public=True).order_by('-album_date')[:6] self.request,
reverse('gallery:main_url')
)
context.update({
'canonical_url': canonical_url,
'latest_albums': Album.objects.filter(is_public=True).order_by('-album_date')[:6],
})
return context return context
@ -31,7 +39,11 @@ class About(TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['canonical_url'] = self.request.build_absolute_uri(reverse('gallery:about_url')) canonical_url = build_canonical_url(
self.request,
reverse('gallery:about_url')
)
context['canonical_url'] = canonical_url
return context return context

View file

@ -8,6 +8,8 @@ from django.urls import reverse
from django.views import View from django.views import View
from django.views.generic import DetailView, ListView, TemplateView from django.views.generic import DetailView, ListView, TemplateView
from gallery.utils import build_canonical_url
from ..models import Album, Photo, Redir from ..models import Album, Photo, Redir
@ -32,11 +34,11 @@ class PhotosList(ListView):
page_obj = context.get('page_obj') page_obj = context.get('page_obj')
# Canonical_url # Canonical_url
page = self.request.GET.get('page') canonical_url = build_canonical_url(
if page_obj.number > 1: self.request,
canonical_url = f"{self.request.build_absolute_uri(reverse('gallery:photos_url'))}?page={page}" reverse('gallery:photos_url'),
else: params={'page': page_obj.number, 'order': order}
canonical_url = self.request.build_absolute_uri(reverse('gallery:photos_url')) )
context.update({ context.update({
'order': self.request.GET.get('order', 'latest'), 'order': self.request.GET.get('order', 'latest'),
@ -54,7 +56,6 @@ class PhotoDetail(DetailView):
def get_object(self, queryset=None): def get_object(self, queryset=None):
album_slug = self.kwargs.get('album_slug') album_slug = self.kwargs.get('album_slug')
photo_slug = self.kwargs.get('photo_slug') photo_slug = self.kwargs.get('photo_slug')
# photo = get_object_or_404(Photo.objects.select_related('album'), slug=photo_slug, album__slug=album_slug)
photo = get_object_or_404(Photo.objects.select_related('album'), slug=photo_slug, album__slug__iexact=album_slug) photo = get_object_or_404(Photo.objects.select_related('album'), slug=photo_slug, album__slug__iexact=album_slug)
if photo.slug not in self.request.session: if photo.slug not in self.request.session:
@ -65,10 +66,16 @@ class PhotoDetail(DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
# Canonical_url
canonical_url = build_canonical_url(
self.request,
self.object.get_absolute_url()
)
context.update({ context.update({
'next': self.object.get_next(), 'next': self.object.get_next(),
'prev': self.object.get_prev(), 'prev': self.object.get_prev(),
'canonical_url': self.request.build_absolute_uri(self.object.get_absolute_url()), 'canonical_url': canonical_url,
'liked': self.request.session.get(f"liked_{self.object.slug}", False) 'liked': self.request.session.get(f"liked_{self.object.slug}", False)
}) })
return context return context
@ -131,10 +138,16 @@ class PhotoSlideshow(DetailView):
if not next_photo: if not next_photo:
next_photo = Photo.objects.filter(album=current_photo.album).order_by('taken_at').first() next_photo = Photo.objects.filter(album=current_photo.album).order_by('taken_at').first()
# Canonical_url
canonical_url = build_canonical_url(
self.request,
current_photo.get_slideshow_url()
)
context.update({ context.update({
'next_photo': next_photo, 'next_photo': next_photo,
'liked': self.request.session.get(f"liked_{current_photo.slug}", False), 'liked': self.request.session.get(f"liked_{current_photo.slug}", False),
'canonical_url': self.request.build_absolute_uri(current_photo.get_slideshow_url()), 'canonical_url': canonical_url,
}) })
return context return context