我的应用实现了一个购物车,匿名用户可以在其中购买产品。用户登录仅在付款前需要。如何实施?
主要的挑战是烧瓶必须跟踪用户(即使是匿名的)及其订单。我目前的方法是利用分配给AnonymousUserMixin
的{{1}}对象。假设current_user
在整个会话期间不会改变。但是,我注意到一个新的current_user
对象被分配给AnonymousUserMixin
,例如,每次刷新浏览器页面时。请注意,如果用户通过身份验证,则不会发生这种情况。
有关如何规避此事的任何建议?
答案 0 :(得分:8)
不需要自定义AnonymousUserMixin
,您可以将购物车数据保存在会话中:
答案 1 :(得分:1)
如果您愿意,可以使用AnonymousUserMixin
子类,但需要添加一些逻辑,以便将每个匿名用户与存储在数据库中的购物车相关联。
这是你可以做的:
当新用户连接到您的应用程序时,您会分配一个随机生成的唯一ID。您可以将此随机ID写入用户会话(如果您希望在用户关闭浏览器窗口时删除购物车)或长期cookie(如果您希望即使在关闭浏览器后也能记住购物车)。您可以使用Flask-Login实际管理会话/ cookie,您不必将未知用户视为匿名用户,只要您为其分配ID,就可以将其视为已登录用户。
您如何知道匿名用户是已知还是新用户?当用户连接时,检查会话或cookie是否存在,并在那里查找id。如果找到了ID,则可以为用户找到购物车。如果使用AnonymousUserMixin
的子类,则可以将id添加为成员变量,这样即使对于匿名用户也可以current_user.id
。您可以在Flask-Login用户加载器回调中使用此逻辑。
当用户准备付款时,您将匿名用户转换为注册用户,同时保留该ID。
如果您有一个cron作业,通常会从数据库中清除旧的/放弃的匿名购物车,您可能会发现一个旧的匿名用户连接并提供了一个在数据库中没有购物车的用户ID(因为购物车被视为陈旧和删除)。您可以通过为同一个ID创建一个全新的购物车来处理此问题,甚至可以通知用户购物车的内容已过期并已删除。
希望这有帮助!