在我的应用程序中,我使用flask-security添加了身份验证和授权主题。 SQLAlchemy也用作数据提供者(MySQL作为后端)。该应用程序运行正常。
然后,我做了一些MySQL跟踪,日志显示我在应用程序请求的每个URL上,flask-security库发送两个数据库查询:
select ... from user where user.id = 'the user identifier'
select ... from role, roles_users ...
我认为这是一个性能问题,我希望尽量减少这些查询。 我不知道是否缺少配置功能。
答案 0 :(得分:1)
无需进一步优化(比如使用Redis缓存SQL响应或用户对象),我认为您无法避免第一个请求。在大多数情况下,您需要有关用户的数据,并且您不希望将这些数据存储在用户的会话cookie中。您可以再次使用类似Redis的东西来存储这些信息服务器端,并通过会话ID索引。
但是你可以使用JOIN来避免第二个请求。通过同时执行第一个和第二个请求,可以节省一些传输时间+数据库可以选择适当的查询计划。
答案 1 :(得分:0)
一个选项可能是覆盖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
进行阅读。