【问题标题】:How to track anonymous users with Flask如何使用 Flask 跟踪匿名用户
【发布时间】:2015-07-09 19:28:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: python flask flask-login anonymous-users


    【解决方案1】:

    不需要自定义AnonymousUserMixin,可以在session中保存购物车数据:

    • 匿名用户在他的购物车中添加了一些东西 -> 使用购物车数据更新他的会话
    • 用户想要结帐 -> 将他重定向到登录页面
    • 已登录的用户又回到了结账处 -> 将他的购物车数据从会话中取出,并在他一直处于登录状态的情况下执行您想做的任何事情

    【讨论】:

      【解决方案2】:

      您可以根据需要使用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 创建一个全新的购物车来处理此问题,您甚至可以通知用户购物车的内容已过期并被删除。

      希望这会有所帮助!

      【讨论】:

      • 谢谢!有没有办法保护我的应用免受恶意用户的攻击?有人可以通过 (i) 创建购物车和 (ii) 在循环中关闭会话(或删除 cookie)来进行攻击。有没有办法让 cron 作业(或任务队列)帮助避免数据库大小不受控制地增加?我希望避免在每次创建购物车时检查数据库的大小。
      • 没有什么是 100% 万无一失的,但您可以跟踪用户的 IP 地址并确保您不允许多个购物车用于同一个购物车。或者,您可以将创建日期写入所有购物车,当您需要创建新购物车时,运行查询以了解您在过去 N 分钟内创建了多少购物车。如果您发现这个数字很大,您可以停止创建新的购物车。
      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多