2 Commits

Author SHA1 Message Date
erjemin 9cce6817cf back: вернул выбор случайности через "?" на SQLite
Build and Push Docker Image / build-and-push (push) Successful in 27s
2026-07-06 12:52:20 +03:00
erjemin ed7c106930 fix: Убрал дублирование CMD из Dockerfile - теперь полный котроль через compose
Build and Push Docker Image / build-and-push (push) Successful in 32s
2026-07-06 12:37:25 +03:00
2 changed files with 13 additions and 36 deletions
+2 -2
View File
@@ -104,5 +104,5 @@ EXPOSE 8000
# Переходим в директорию с manage.py для корректного запуска gunicorn # Переходим в директорию с manage.py для корректного запуска gunicorn
WORKDIR /home/app/web/dicquo WORKDIR /home/app/web/dicquo
# Команда запуска # Команда запуска (не обязательная, так как в docker-compose.yml указана своя команда)
CMD ["gunicorn", "--workers", "3", "--bind", "0.0.0.0:8000", "dicquo.wsgi:application"] # CMD ["gunicorn", "--workers", "3", "--bind", "0.0.0.0:8010", "dicquo.wsgi:application"]
+11 -34
View File
@@ -12,7 +12,6 @@ from django.core.exceptions import ObjectDoesNotExist
from django.views.generic import DetailView, TemplateView from django.views.generic import DetailView, TemplateView
import time import time
import pytils import pytils
import random
from web.models import TbDictumAndQuotes, TbImages, TbAuthor from web.models import TbDictumAndQuotes, TbImages, TbAuthor
@@ -99,11 +98,9 @@ class CommonContextMixin:
# --- 4. ВЫБОР КАРТИНКИ --- # --- 4. ВЫБОР КАРТИНКИ ---
if dq.kImages_id is None: if dq.kImages_id is None:
if len(tags) != 0: if len(tags) != 0:
# Используем Python random вместо order_by('?') для производительности tagged_image = TbImages.objects.filter(tags__name__in=tags).order_by('?').first()
tagged_images = list(TbImages.objects.filter(tags__name__in=tags).values_list('id', 'imFile')) if tagged_image:
if tagged_images: context.update({'IMAGE': tagged_image.imFile})
tagged_image = tagged_images[random.randint(0, len(tagged_images) - 1)]
context.update({'IMAGE': tagged_image[1]})
else: else:
context.update({'IMAGE': dq.kImages.imFile}) context.update({'IMAGE': dq.kImages.imFile})
@@ -113,13 +110,7 @@ class CommonContextMixin:
# --- 6. ВЫБОР СЛЕДУЮЩЕЙ ЦИТАТЫ --- # --- 6. ВЫБОР СЛЕДУЮЩЕЙ ЦИТАТЫ ---
# Сначала пробуем найти следующую цитату, которую мы еще не видели # Сначала пробуем найти следующую цитату, которую мы еще не видели
# Используем Python random вместо order_by('?') для производительности dq_next = queryset.exclude(id__in=seen_ids).order_by('?').first()
unseen_ids = queryset.exclude(id__in=seen_ids).values_list('id', flat=True)
if unseen_ids:
dq_next_id = list(unseen_ids)[random.randint(0, len(unseen_ids) - 1)]
dq_next = queryset.filter(id=dq_next_id).first()
else:
dq_next = None
# Если таких нет (мы посмотрели все цитаты в этом контексте/теге) # Если таких нет (мы посмотрели все цитаты в этом контексте/теге)
if dq_next is None: if dq_next is None:
@@ -132,12 +123,7 @@ class CommonContextMixin:
# Вариант: Очистить seen_ids, чтобы в следующий раз (на некст странице) список был пуст? # Вариант: Очистить seen_ids, чтобы в следующий раз (на некст странице) список был пуст?
# Или просто выбрать любую КРОМЕ текущей? # Или просто выбрать любую КРОМЕ текущей?
other_ids = list(queryset.exclude(id=dq.id).values_list('id', flat=True)) dq_next = queryset.exclude(id__in=seen_ids).order_by('?').first()
if other_ids:
dq_next_id = other_ids[random.randint(0, len(other_ids) - 1)]
dq_next = queryset.filter(id=dq_next_id).first()
else:
dq_next = None
# Если мы действительно прошли весь цикл по тегу, логично сбросить seen_ids, # Если мы действительно прошли весь цикл по тегу, логично сбросить seen_ids,
# чтобы пользователь мог заново проходить этот список случайно, а не "застревать" на последних. # чтобы пользователь мог заново проходить этот список случайно, а не "застревать" на последних.
@@ -214,19 +200,13 @@ class IndexView(CommonContextMixin, TemplateView):
if active_qs is not None: if active_qs is not None:
# Если мы в режиме фильтрации, тоже стараемся не показывать то, что уже видели # Если мы в режиме фильтрации, тоже стараемся не показывать то, что уже видели
unseen_ids = list(active_qs.exclude(id__in=seen_ids).values_list('id', flat=True)) dq = active_qs.exclude(id__in=seen_ids).order_by('?').first()
if unseen_ids:
dq = active_qs.filter(id=unseen_ids[random.randint(0, len(unseen_ids) - 1)]).first()
else:
dq = None
# Если после фильтрации ничего не осталось (мы просмотрели все цитаты тега) # Если после фильтрации ничего не осталось (мы просмотрели все цитаты тега)
if dq is None: if dq is None:
# Сбрасываем историю и берем любую # Сбрасываем историю и берем любую
self.request.session['seen_ids'] = [] self.request.session['seen_ids'] = []
all_ids = list(active_qs.values_list('id', flat=True)) dq = active_qs.order_by('?').first()
if all_ids:
dq = active_qs.filter(id=all_ids[random.randint(0, len(all_ids) - 1)]).first()
if dq is None: if dq is None:
# Если тег не задан, или по тегу ничего не нашлось совсем # Если тег не задан, или по тегу ничего не нашлось совсем
@@ -234,14 +214,11 @@ class IndexView(CommonContextMixin, TemplateView):
active_qs = TbDictumAndQuotes.objects.all() active_qs = TbDictumAndQuotes.objects.all()
# Случайная цитата (с учетом истории, чтобы главная страница тоже не зацикливалась) # Случайная цитата (с учетом истории, чтобы главная страница тоже не зацикливалась)
unseen_ids = list(active_qs.exclude(id__in=seen_ids).values_list('id', flat=True)) dq = active_qs.exclude(id__in=seen_ids).order_by('?').first()
if unseen_ids:
dq = active_qs.filter(id=unseen_ids[random.randint(0, len(unseen_ids) - 1)]).first() if dq is None:
else:
self.request.session['seen_ids'] = [] self.request.session['seen_ids'] = []
all_ids = list(active_qs.values_list('id', flat=True)) dq = active_qs.order_by('?').first()
if all_ids:
dq = active_qs.filter(id=all_ids[random.randint(0, len(all_ids) - 1)]).first()
if dq: if dq:
# Используем миксин, ОБЯЗАТЕЛЬНО передаем active_qs # Используем миксин, ОБЯЗАТЕЛЬНО передаем active_qs