【问题标题】:flask-security: minimize the database hitsflask-security:最小化数据库命中
【发布时间】:2014-09-03 10:14:54
【问题描述】:

在我的应用程序中,我使用了flask-security 来添加身份验证和授权主题。 SQLAlchemy 也用作数据提供者(以 MySQL 作为后端)。该应用程序运行良好。

然后,我进行了一些 MySQL 跟踪,日志显示在应用程序请求的每个 URL 处,flask-security 库都会发送两个数据库查询:

  • select ... from user where user.id = 'the user identifier'
  • select ... from role, roles_users ...

我认为这是一个性能问题,我希望尽量减少这些查询。 我不知道我是否缺少配置功能。

【问题讨论】:

  • 你找到好的解决方案了吗?

标签: python flask flask-login flask-security


【解决方案1】:

一种选择可能是覆盖 Flask-Login 的 user_loader。不过,请参阅 this 讨论,了解为什么经常需要在每个请求中加载用户信息。

这就是 Flask-Security 实现user_loader 的方式。

def _user_loader(user_id):
    return _security.datastore.find_user(id=user_id)

这最终会产生一个 SQL 查询。

后人,here's如何启用对sqlalchemy发出的SQL查询的跟踪(调试):

import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

另一个解决方案可能有点过度设计是为用户和角色拥有一个单独的 SQL-lite 数据库(用于 Flask-Login、Flask-Security 等在)。在这种情况下,您将拥有 ~0 latency 用于读取。

【讨论】:

    【解决方案2】:

    如果不进行进一步优化(例如使用 Redis 缓存 SQL 响应或用户对象),我认为您无法避免第一次请求。在大多数情况下,您需要有关用户的数据,并且您不想将这些数据存储在用户的会话 cookie 中。同样,您可以使用 Redis 之类的东西在服务器端存储这些信息,由会话 ID 索引。

    但是,您可能可以使用 JOIN 来避免第二个请求。通过同时执行第一个和第二个请求,可以节省一些运输时间 + 数据库将能够选择适当的查询计划。

    【讨论】:

    • 决定 Flask-Security 向数据库发送哪些 SQL 语句以及何时发送不是我的选择。我正在寻找一种方法来最小化它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多