7

我的应用程序实现了一个购物车,匿名用户可以在其中将产品装满购物车。只有在付款前才需要用户登录。如何实施?

主要挑战是烧瓶必须跟踪用户(即使是匿名的)和他们的订单。我目前的方法是利用AnonymousUserMixin分配给current_user. 假设current_user在整个会话期间不会改变。但是,我注意到,例如,在每次浏览器页面刷新时,都会AnonymousUserMixin分配一个新对象。current_user请注意,如果用户通过身份验证,则不会发生这种情况。

有关如何规避此问题的任何建议?

4

2 回答 2

9

不需要自定义AnonymousUserMixin,您可以将购物车数据保留在会话中:

  • 匿名用户向他的购物车添加一些东西 -> 用购物车数据更新他的会话
  • 用户想要签出 -> 将他重定向到登录页面
  • 已登录的用户返回结帐时 -> 将他的购物车数据从会话中取出,并在他一直登录的情况下做任何你想做的事情
于 2015-04-30T08:06:01.590 回答
4

如果您愿意,您可以使用AnonymousUserMixin子类,但您需要为其添加一些逻辑,以便您可以将每个匿名用户与存储在数据库中的购物车相关联。

这是你可以做的:

  1. 当新用户连接到您的应用程序时,您会分配一个随机生成的唯一 ID。您可以将此随机 id 写入用户会话(如果您希望在用户关闭浏览器窗口时删除购物车)或长期 cookie(如果您希望即使在关闭浏览器后也记住购物车)。您实际上可以使用 Flask-Login 来管理会话/cookie,您不必将未知用户视为匿名用户,只要为他们分配 id,您就可以将他们视为已登录用户。

  2. 您如何知道匿名用户是已知用户还是新用户?当用户连接时,您检查会话或 cookie 是否存在,并在那里查找 id。如果找到一个 id,那么您可以为用户找到购物车。如果您使用 的子类AnonymousUserMixin,那么您可以将 id 添加为成员变量,这样您current_user.id甚至可以为匿名用户执行此操作。您可以在 Flask-Login 用户加载器回调中使用此逻辑。

  3. 当用户准备好付款时,您将匿名用户转换为注册用户,同时保留 id。

  4. 如果您有一个定期清理数据库中旧的/废弃的匿名购物车的 cron 作业,您可能会发现一个旧的匿名用户连接并提供了一个在数据库中没有购物车的用户 ID(因为购物车被认为是陈旧的并且已删除)。您可以通过为相同的 id 创建一个全新的购物车来处理这个问题,您甚至可以通知用户购物车的内容已过期并被删除。

希望这可以帮助!

于 2015-05-02T23:48:40.033 回答