Получите все файлы cookie с именем, включающим подстроку

#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")]