Как отслеживать анонимных пользователей с помощью Flask

В моем приложении реализована корзина покупок, в которой анонимные пользователи могут заполнять свою корзину продуктами. Логин пользователя требуется только перед оплатой. Как это можно реализовать?

Основная проблема заключается в том, что flask должен отслеживать пользователя (даже если он анонимный) и его заказы. Мой текущий подход заключается в использовании объекта AnonymousUserMixin, назначенного current_user. Предполагается, что current_user не изменится на протяжении всего сеанса. Однако я заметил, что новый объект AnonymousUserMixin назначается, например, current_user при каждом обновлении страницы браузера. Обратите внимание, что этого не происходит, если пользователь аутентифицирован.

Любые предложения о том, как обойти это?


person LuisO    schedule 30.04.2015    source источник


Ответы (2)


Нет необходимости в пользовательском AnonymousUserMixin, вы можете сохранить данные корзины покупок в сеансе:

  • анонимный пользователь добавляет что-то в свою корзину -> обновить свою сессию данными корзины
  • пользователь хочет проверить -> перенаправить его на страницу входа
  • вошедший в систему пользователь вернулся к кассе -> удалите данные своей корзины из сеанса и сделайте все, что вы сделали бы, если бы он все время был в системе
person Bartosz Marcinkowski    schedule 30.04.2015

Вы можете использовать подкласс AnonymousUserMixin, если хотите, но вам нужно добавить к нему некоторую логику, чтобы вы могли связать каждого анонимного пользователя с корзиной, хранящейся в вашей базе данных.

Вот что вы можете сделать:

  1. Когда новый пользователь подключается к вашему приложению, вы назначаете случайно сгенерированный уникальный идентификатор. Вы можете записать этот случайный идентификатор в сеанс пользователя (если вы хотите, чтобы корзина удалялась, когда пользователь закрывает окно браузера) или в долгоживущий файл cookie (если вы хотите, чтобы корзина запоминалась даже после закрытия браузера). Вы можете использовать Flask-Login для управления сеансом / файлом cookie на самом деле, вам не нужно рассматривать неизвестных пользователей как анонимных, как только вы назначаете им идентификатор, вы можете рассматривать их как зарегистрированных пользователей.

  2. Как узнать, известен анонимный пользователь или новый? Когда пользователь подключается, вы проверяете, существует ли сеанс или файл cookie, и ищите там идентификатор. Если идентификатор найден, вы можете найти корзину для пользователя. Если вы используете подкласс AnonymousUserMixin, вы можете добавить идентификатор в качестве переменной-члена, чтобы вы могли выполнять current_user.id даже для анонимных пользователей. Вы можете иметь эту логику в обратном вызове загрузчика пользователя Flask-Login.

  3. Когда пользователь готов заплатить, вы конвертируете анонимного пользователя в зарегистрированного пользователя, сохраняя идентификатор.

  4. Если у вас есть задание cron, которое регулярно удаляет старые/брошенные анонимные корзины из базы данных, вы можете обнаружить, что старый анонимный пользователь подключается и предоставляет идентификатор пользователя, у которого нет корзины в базе данных (поскольку корзина считалась устаревшей и удален). Вы можете справиться с этим, создав новую корзину для того же идентификатора, и вы даже можете уведомить пользователя о том, что срок действия содержимого корзины истек и он был удален.

Надеюсь это поможет!

person Miguel    schedule 02.05.2015
comment
Спасибо! Есть ли способ защитить мое приложение от злоумышленников? Кто-то может атаковать, (i) создавая корзину и (ii) закрывая сеанс (или удаляя куки) в цикле. Есть ли способ заставить задание cron (или очередь задач) помочь избежать неконтролируемого увеличения размера базы данных? Я бы хотел избежать проверки размера базы данных при каждом создании корзины. - person LuisO; 05.05.2015
comment
Нет чего-то стопроцентно надежного, но вы можете отслеживать IP-адрес пользователя и убедиться, что вы не разрешаете использовать несколько корзин для одной и той же. Или вы можете написать дату создания для всех корзин, и когда вам нужно создать новую, запустите запрос, чтобы узнать, сколько корзин вы создали за последние N минут. Если вы обнаружите, что это большое число, вы можете прекратить создавать новые корзины. - person Miguel; 05.05.2015