#python #django #list #cookies #substring
Вопрос:
Я создаю эту простую систему случайных сообщений, и проблема, с которой я сталкивался, заключается в том, чтобы рекомендовать сообщения, которые пользователь раньше не видел. Чтобы отличить пользователя, который видел сообщение, от того, кто его не видел, я сохраняю файл cookie (для анонимных зрителей) примерно так:
def render_to_response(self, context, **response_kwargs):
# Logic
response.set_cookie(f'viewed{post_id}', 'true', max_age=60*60*24*10) # 30 Days Till Expiry
Здесь хранится файл cookie, например, если у меня есть сообщение с идентификатором=12, оно будет сохранено как:
viewed12, true
Чтобы получить то значение, которое я делаю:
request.COOKIES.get(f'viewed{post_id}')
Я хочу знать, извлеките все файлы cookie, которые начинаются со строки viewed
, а затем я хочу получить все после этого (поэтому я просто хочу получить идентификатор сообщения из файла cookie). Это мой код:
import random
def random_post(request):
objects_to_exclude = [1, 2, 8] # Using the cookies with substring "viewed" I want to insert into this list
posts = Post.objects.all().exclude(pk__in=objects_to_exclude)
post = random.choice(posts)
return render(request, 'blog/post_detail.html', {'object': post, 'post': post, 'id': post.id, 'pk': post.id, 'random': 'True'})
В принципе , я хочу найти все файлы cookie с подстрокой viewed
, получить номер после него, а затем вставить его в вызванный список objects_to_exclude
.
Редактировать: (Мне не нужно проверять, является ли значение false для просмотренного файла cookie, так как только просмотренные сообщения будут иметь файлы cookie, сохраненные по их идентификатору pk)
Комментарии:
1. Рассматривали ли вы возможность установки одного файла cookie (например
viewed
) и сохранения идентификаторов записей, разделенных запятыми, в качестве значения?2. @Selcuk, да, я рассматривал этот способ, но мне интересно, смогу ли я сделать это таким образом, так как для этого мне пришлось бы изменить большую часть своего кода. Если это единственный способ, то да, я обдумал и могу это сделать тогда.
3. ПРАВКА: Если кто-нибудь в будущем увидит это, я бы рекомендовал не хранить файлы cookie для каждого просмотренного поста, потому что скоро вы достигнете предела. Подробнее читайте здесь: docs.devexpress.com/AspNet/11912/common-concepts/…
Ответ №1:
Если вы можете провести рефакторинг, лучшим способом продвижения вперед, по-видимому, является установка одного файла cookie (например viewed
) и сохранение идентификаторов записей, разделенных запятыми, в качестве значения. Если вы не можете, это должно сработать:
objects_to_exclude = [int(cookie_name[6:]) for cookie_name in request.COOKIES if cookie_name.startswith("viewed")]