5

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

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

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

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

4

2 回答 2

1

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

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

于 2014-07-13T10:12:26.060 回答
0

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

这就是 Flask-Security 实现user_loader.

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

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

对于后代,以下如何启用对由以下人员发出的 SQL 查询的跟踪(调试)sqlalchemy

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

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

于 2017-09-17T16:32:48.727 回答