Реализация Последних Посещенных/Последних Страниц В Django

У меня часто случается, что на новом ресурсе я теряюсь в море разных функций и настроек и, чтобы не упустить из виду что-то интересное, открываю/дублирую вкладку.

Это не всегда удобно, да и кнопка «назад» иногда срабатывает непредсказуемо, например, из-за истории push, или из-за того, что обработчик POST «сломался» на редиректе (не назло, а ради эксперимента).

Поэтому, чтобы не раздражать пользователя, я решил сделать последние страницы.

Рассказ об этом ниже под катом.



Вариант первый

Изначально я хотел реализовать эту функцию через Middleware, но столкнулся с проблемой: запомнить URL и поместить его в кеш — не проблема, а вот получить текущий заголовок страницы — это да.

И я до сих пор считаю, что единственный правильный способ реализовать это — использовать промежуточное программное обеспечение.

Глупые решения: используйте процесс_ответ() и разобрать заголовок; используйте ajax-скрипт на стороне клиента и все подобное, чтобы получить заголовок.

Поэтому нужно как-то добраться до шаблонизатора из мидлвара и получить там рут {% заголовок блока %} .

Буду рад, если вы поделитесь своим мнением по этому поводу.



Вариант второй

Используйте тег шаблона.

Я именно так и сделал, но существенный минус этого варианта в том, что шаблоны нужно редактировать вручную, либо думать, как встроить этот тег в base.html.

Вариант третий

Используйте ajax-скрипт типа трекера статистики.

Преимущество этого варианта в том, что результаты можно использовать для различных нужд, например, для статистики.

Минусы: дополнительный скрипт, дополнительные обработчики, дополнительные данные.




Тег для сохранения заголовка Если вы используете ajax-запросы к одним и тем же представлениям, то стоит добавить проверку request.is_ajax() , чтобы не сохранять для пользователя неработающие ссылки.

  
  
  
   

@register.simple_tag(takes_context=True, name='save_visited') def save_visited(context, title, **kwargs): request = context['request'] # store last five pages identify_by = get_user_identification(request) visited_pages = cache.get('visited_pages_%s' % identify_by, [])[:4] # context.use_tz - why None if set True in settings? # may be we should save datetime.now() and convert it in getter? now = timezone.now() bundle = force_unicode(title), request.get_full_path()[:255], now visited_pages.insert(0, bundle) cache.set('visited_pages_%s' % identify_by, visited_pages, 60*60*24) return title

Использование:

{% extends 'forum/themes/default/edit_profile.html' %} {% load last_visited i18n %} {% block title %}{% save_visited _("Profile setup") %}{% endblock %}

Получатель тегов, выгружает список в указанную переменную контекста.



@register.simple_tag(takes_context=True, name='load_visited') def load_visited(context, variable, **kwargs): identify_by = get_user_identification(context['request']) context[variable] = cache.get('visited_pages_%s' % identify_by, []) return u''

Использование:

{% load_visited 'visited' %} {% for title, uri, dt in visited %} <a href="{{ uri }}">{{ title }} {% trans "at" %} {{ dt }}</a><br/> {% endfor %}

Для экспериментов суть .

И все же вариант промежуточного программного обеспечения не дает мне покоя.

Теги: #django framework #django шаблоны #последние страницы #python #django

Вместе с данным постом часто просматривают: