Django удаляет сессии при выходе с аккаунта?
Реализовал просмотр последних товаров через сессии. Когда авторизован товары показываются как надо. Но стоит мне выйти из аккаунта, возникает ошибка KeyError at / 'recently_viewed'. Я полагаю, что сессии при логауте очищаются и, соответственно, ключ recently_viewed удален. Вот и возникает ошибка. Это можно как-то исправить и сохранять сессию даже при выходе из аккаунта? Вот функция логаута:
def logout_user(request):
logout(request)
return redirect('home')
Представление товара:
class Detail(DetailView):
model = Product
template_name = 'app/detail.html'
context_object_name = 'product_detail'
slug_url_kwarg = 'product_slug'
def get(self, request, *args, **kwargs):
global recently_viewed_products
recently_viewed_products = None
if 'recently_viewed' not in request.session:
request.session['recently_viewed'] = [self.kwargs['product_slug']]
else:
if self.kwargs['product_slug'] in request.session['recently_viewed']:
request.session['recently_viewed'].remove(self.kwargs['product_slug'])
request.session['recently_viewed'].append(self.kwargs['product_slug'])
else:
request.session['recently_viewed'].append(self.kwargs['product_slug'])
recently_viewed_products = Product.objects.filter(slug__in=request.session['recently_viewed']).order_by('last_visit')
request.session.modified = True
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
Product.objects.filter(slug=self.kwargs['product_slug']).update(views=F('views') + 1)
self.object.last_visit = datetime.now()
self.object.save()
context['recently'] = recently_viewed_products
return context
def get_queryset(self):
return Product.objects.filter(draft=False)
Поменял немного функцию логаута. Теперь она выглядит вот так:
def logout_user(request):
your_data = request.session.get('recently_viewed', None)
current_expiry = request.session.get('_session_expiry')
logout(request)
if your_data:
request.session['recently_viewed'] = your_data
if current_expiry:
request.session['_session_expiry'] = current_expiry
return redirect('home')
- Получаю из сессии ключ просмотренных товаров. Если такого ключа нет, то передаю None.
- Получаю время жизни сессии.
- Логаут
- Делаю проверку. Если your_data что-то содержит(не None), то в сессии создаю новый ключ с таким же названием recently_viewed. Передаю данные для этого ключа из your_data.
- Далее такая же проверка, как выше. Только тут передаем время жизни сессии.
- Редирект