如何在 Flask-Login 中实现 user_loader 回调

2024-04-17

我正在尝试使用 Flask 和Flask-登录 http://packages.python.org/Flask-Login在 Flask 应用程序中实现用户身份验证的扩展。目标是从数据库中提取用户帐户信息,然后登录用户,但我遇到了困难;但是,我已将其范围缩小到 Flask-Login 行为的特定部分。

根据Flask-登录文档 http://packages.python.org/Flask-Login/#how-it-works,我需要创建一个 user_loader“回调”函数。这个函数的实际目的和实现让我困惑了几天:

您将需要提供 user_loader 回调。使用这个回调 从会话中存储的用户 ID 重新加载用户对象。它 应该获取用户的 Unicode ID,并返回相应的 用户对象。例如:

@login_manager.user_loader
def load_user(userid):
    return User.get(userid)

现在,假设我希望用户在表单中输入名称和密码,检查数据库,然后登录用户。数据库的东西工作正常,对我来说没有问题。

这个“回调”函数想要传递一个用户 ID #,并返回 User 对象(我从数据库加载的内容)。但我真的不明白它应该检查/做什么,因为无论如何用户 ID 都是从同一个地方提取的。我可以“某种程度上”让回调工作,但它看起来很混乱/黑客,并且它会使用浏览器请求的每个资源来访问数据库。我真的不想检查我的数据库以便在每次刷新页面时下载 favicon.ico,但 Flask-login 似乎强制这样做。

如果我不再检查数据库,那么我就无法从此函数返回 User 对象。 User 对象/类是在 Flask 路由中创建的用于登录,因此超出了回调的范围。

我不明白的是如何将 User 对象传递到这个回调函数中,而不必每次都访问数据库。或者,找出如何以更有效的方式做到这一点。我肯定错过了一些基本的东西,但我已经盯着它看了几天了,向它扔了各种函数和方法,但没有任何效果。

这是我的测试代码中的相关片段。用户类:

class UserClass(UserMixin):
     def __init__(self, name, id, active=True):
          self.name = name
          self.id = id
          self.active = active

     def is_active(self):
          return self.active

我创建的用于将用户对象返回到 Flask-Login 的 user_loader 回调函数的函数:

def check_db(userid):

     # query database (again), just so we can pass an object to the callback
     db_check = users_collection.find_one({ 'userid' : userid })
     UserObject = UserClass(db_check['username'], userid, active=True)
     if userObject.id == userid:
          return UserObject
     else:
          return None

我不完全理解“回调”(必须返回用户对象,该对象是在从数据库中提取后创建的):

@login_manager.user_loader
def load_user(id):
     return check_db(id)

登录路径:

@app.route("/login", methods=["GET", "POST"])
def login():
     if request.method == "POST" and "username" in request.form:
          username = request.form["username"]

          # check MongoDB for the existence of the entered username
          db_result = users_collection.find_one({ 'username' : username })

          result_id = int(db_result['userid'])

          # create User object/instance
          User = UserClass(db_result['username'], result_id, active=True)

          # if username entered matches database, log user in
          if username == db_result['username']:
               # log user in, 
               login_user(User)
               return url_for("index"))
          else:
               flash("Invalid username.")
      else:
           flash(u"Invalid login.")
      return render_template("login.html")

我的代码“有点”有效,我可以登录和退出,但正如我所说,它必须命中数据库以获取所有内容,因为我必须在与其余部分不同的命名空间/范围中向回调函数提供一个 User 对象发生登录操作。我很确定我做错了,但我不知道怎么做。

Flask-login 提供的示例代码这样做 https://github.com/maxcountryman/flask-login/blob/master/example/login-example.py,但这只是有效的,因为它是从全局硬编码字典中提取 User 对象,而不是像在数据库这样的现实场景中,必须检查 DB 并创建 User 对象after用户输入他们的登录凭据。我似乎找不到任何其他示例代码来说明使用烧瓶登录数据库。

这里缺少什么?


您需要根据每个请求从数据库加载用户对象。该要求的最重要原因是 Flask-Login 每次都会检查身份验证令牌以确保其持续有效性。该令牌的计算可能需要存储在用户对象上的参数。

例如,假设用户有两个并发会话。其中之一是,用户更改了密码。在后续请求中,用户必须从第二个会话中注销并强制重新登录,以保证应用程序的安全。考虑一下由于用户忘记退出计算机而导致第二个会话被盗的情况 - 您希望更改密码以立即解决这种情况。您可能还想让管理员能够将用户踢出。

为了发生这种强制注销,存储在 cookie 中的身份验证令牌必须 1) 部分基于密码或每次设置新密码时都会更改的其他内容; 2)在运行任何视图之前,根据用户对象的最新已知属性进行检查 - 这些属性存储在数据库中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Flask-Login 中实现 user_loader 回调 的相关文章

  • from __future__ importabsolute_import 实际上做了什么?

    I have answered https stackoverflow com a 22679558 2588818一个关于Python中绝对导入的问题 我认为我通过阅读理解了这个问题Python 2 5 变更日志 https docs p
  • Django 管理中的嵌套内联?

    好吧 我有一个相当简单的设计 class Update models Model pub date models DateField title models CharField max length 512 class Post mode
  • 如何在 for 循环中跳过一些迭代

    在 python 中 我通常简单地循环遍历范围 for i in range 100 do something 但现在我想跳过循环中的几个步骤 更具体地说 我想要类似的东西continue 10 这样它就会跳过整个循环并将计数器增加 10
  • 为什么 Dash 在上传文件时会出现解析错误?

    上传 Excel 或 CSV 会导致错误 我遵循了 Dash 演示 但是当我尝试扩展它来执行绘图之类的操作时 它就不起作用了 我不想只显示一张桌子 Dash Table 函数已更新 因此之前使用 Dash Table Experiments
  • Python中的键盘可中断阻塞队列

    It seems import Queue Queue Queue get timeout 10 键盘可中断 ctrl c 而 import Queue Queue Queue get 不是 我总是可以创建一个循环 import Queue
  • 使用 Python 连接从 FTP 检索文件

    我构建了这个简单的工具来暴力破解并连接到 ftp 服务器 import socket import ftplib from ftplib import FTP port 21 ip 192 168 1 108 file1 passwords
  • 为什么我在 Python 中收到“连接被拒绝”错误? (插座)

    我是套接字新手 请原谅我完全缺乏理解 我有一个服务器脚本 server py usr bin python import socket import the socket module s socket socket Create a so
  • 在 AWS Elastic Beanstalk 中部署 Flask 应用程序

    当我部署 Flask 应用程序时 它显示成功 但是当我检索日志时 我看到错误 找不到 Flask 我的需求文件中有烧瓶 任何帮助 Sat Jan 11 06 51 50 503908 2020 error pid 3393 remote 1
  • 为什么通过selenium切换到alert不稳定?

    为什么通过selenium切换到alert不稳定 例如 1 运行代码 一切顺利 一切都很顺利 但如果这段代码在几分钟内运行 那么可能会出现错误 例如 没有可以单击的元素 等等 2 在一个站点上有一个警报窗口 alert driver swi
  • Matplotlib 动画未显示

    当我在家里的电脑上尝试这个时 它可以工作 但在工作的电脑上却不行 这是代码 import numpy as np import matplotlib pyplot as plt import matplotlib animation as
  • 如何将 NaN 数组插入 numpy 二维数组

    我试图在二维数组中的特定位置插入任意数量的 NaN 值行 我正在将来自微控制器的一些数据记录在 csv 文件中并使用 python 进行解析 数据存储在 3 列 2D 数组中 如下所示 122 0 1 0 47 0 123 0 1 0 47
  • 模拟导入失败

    我该如何制作import pkg失败moduleA py 我可以打补丁pkg如果从中导入某些内容则会失败 否则不会失败 test py import os import moduleA from unittest mock import p
  • Python 字符串参数解析

    我正在 python 中使用 cmd 类 它将所有参数作为一个大字符串传递给我 将此 arg 字符串标记为 args 数组的最佳方法是什么 Example args arg arg1 arg2 with quotes arg4 arg5 1
  • 让垂直网格线出现在 matplotlib 的线图中

    我想在绘图上同时获得水平和垂直网格线 但默认情况下仅显示水平网格线 我正在使用一个pandas DataFrame从 python 中的 sql 查询生成 x 轴上带有日期的线图 我不知道为什么它们没有出现在日期上 我试图寻找这个问题的答案
  • 插入失败“OperationalError:没有这样的列”

    我尝试使用我尝试修复的姓名和电话创建一个数据库 但它会随时向我重播 File exm0 py line 14 in
  • Python - Map/Reduce - 如何在使用 DISCO 计数单词示例中读取 JSON 特定字段

    我正在按照 DISCO 示例来计算文件中的单词数 将单词数作为 Map Reduce 作业 http discoproject org doc disco start tutorial html 我对此工作没有任何问题 但是我想尝试从包含
  • 分别计算男女宿舍

    我想要的结果是这样的 males 1990 Q1 value Q2 value Q3 Value Q4 Value females Q1 value Q2 value Q3 Value Q4 value 如果任何值不存在则默认值 0 imp
  • 尝试输入字符串时出现名称错误[重复]

    这个问题在这里已经有答案了 import pickle import os import time class Person def init self number address self number number self addr
  • 如何加速Python循环

    我查看了几个网站上的一些讨论 但没有一个给我解决方案 这段代码运行时间超过5秒 for i in xrange 100000000 pass 我正在研究整数优化问题 我必须使用O n log n 算法编辑 O n 4 算法 其中n代表矩阵的
  • 如何在Python中检查元组是否包含元素?

    我试图找到可用的方法 但找不到 没有contains 我应该使用index 我只想知道该项目是否存在 不需要它的索引 You use in if element in thetuple whatever you want to do

随机推荐

  • 使用 Visual Studio 2017 以 .NET Framework 2.0(不是 .NET Core 2.0)为目标

    我想为打开硬件监视器 https github com openhardwaremonitor openhardwaremonitor 它使用 NET Framework 2 0 同样 它不是 NET Core 2 0 当我克隆存储库并打开
  • 如何读取与 Rust 中的自定义类型关联的枚举值?

    我在 Rust 中有一个实现 如下所示 在主函数中 我正在读取一个值SalaryRange枚举 这将显示High So High This can be a complex type just using string for the qu
  • 如何将 tkinter 按钮垂直浮动在左侧

    我希望我的 tkinter 按钮 条目和文本垂直浮动在左侧的中间 我尝试过使用 pack 和 side left 但它只是水平堆叠它们 如果我可以垂直堆叠它们那就完美了 我尝试过使用网格 但无法将它们放在中间 我尝试过anchor w 但也
  • 如何设置特定Facebook页面的manage_pages权限?

    我如何将我的应用程序的管理页面权限仅设置为特定页面 现在我的应用程序获得了管理 Facebook 用户的所有页面的权限 我如何限制这一点并获得仅访问特定页面的权限 我正在使用一种简单的身份验证方法 app id xxxxxxxxxxxxx
  • Android Oreo (API26) 和 android.app.DownloadManager

    各位 此代码不适用于 Android Oreo 但在旧版本上可以 我可以看到通知和DownloadManager ACTION DOWNLOAD COMPLETE广播消息 Kotlin testButton setOnClickListen
  • OleDB INSERT 命令错误

    我有一个数据库 我使用 MS ACCESS 我有这个插入代码 我可以读取数据 但写入时出错 我按照说明操作 但它不起作用 这是我的代码 OleDbConnection con new OleDbConnection provider Mic
  • 设置 JOptionPane 对话框的助记符和热键

    是否可以为 JOptionPane 对话框中的按钮分配热键和助记符 我希望能够在 JOptionPane 生成的带有 是 否 和 取消 选项的消息对话框中 按 Y 键单击 是 按钮 按 N 键单击 否 按钮 然后按 escape 键激活转义
  • Kubernetes - 以编程方式找出服务 IP 范围 CIDR

    我需要一种方法来获取适用于所有 Kubernetes 集群的服务集群 IP 范围 如 CIDR 我尝试了以下方法 这对于使用 kubeadm 创建的集群效果很好 因为它会 grep apiserver pod 的参数 kubectl clu
  • 对数与平方根的 Big-O

    一般来说 以下内容总是正确的吗 log n O na a 1 s t a is any constant positive integer perhaps very large 如果不是的话 最大的值是多少a这个陈述对于哪些人来说是正确的
  • MySQL 加入不存在的地方

    我有一个连接两个表的 MySQL 查询 Voters 家庭 他们加入voters household id and household id 现在我需要做的是修改它 将选民表连接到第三个表 称为消除 voter id and elimina
  • 如何进行应用内购买去除广告

    我有 Android 游戏项目 我正在使用 ad mob 来投放广告 但是 如果有人想去掉广告就必须先付费怎么办 你能给我教程吗 因为我是 Android 和 Java 的新手 您只需在应用程序中创建一个按钮即可进行应用内购买 并且 一旦用
  • 使用 Gradle 运行命令行并保存输出结果

    我想使用 Gradle 运行命令行 该命令有一个输出 我在 Windows powershell 中运行此命令 mybat bat myArgs当我按回车键时 它会打印一些数字 如下所示 123456我想用 gradle 运行这个命令并保存
  • 在 SwiftUI 中创建自定义 Spacer() 时如何读取容器轴

    在 SwiftUI 中Spacer 文档 https developer apple com documentation swiftui spacer https developer apple com documentation swif
  • Sitecore - 如何导入内容?

    因此 我收到了一项新任务 将内容从网站导入到使用 Sitecore CMS 构建的新网站 我的客户基本上正在进行改造 以前的网站是使用非常旧的 CMS 构建的 所有内容都是 HTML 格式 我实际上正在考虑抓取旧网站并将所有内容转储为 cs
  • 在 Android Studio 上导入 panoramaGL

    我在项目中导入 PanoramaGL 库时遇到问题 这是图书馆https github com zarelaky panoramagl android tree master PanoramaGL https github com zare
  • 何时使用 HashMap 而不是 LinkedList 或 ArrayList,反之亦然

    为什么我们不能总是使用 HashMap 尽管它在添加 删除操作上比 ArrayList 或 LinkedList 高效得多 而且与元素的数量无关 我用 google 搜索了一下 发现了一些原因 但使用 HashMap 总有一种解决方法 而且
  • 获得令牌后如何从 Google Plus API 获取电子邮件地址

    我使用 oauth2 0 获得了 accesstoken 我能够获取人名 性别等 但无法获取用户的电子邮件地址 任何人都可以粘贴一些示例代码或任何有关如何从 google plus API 获取电子邮件地址的建议吗 如果用户明确授权您的应用
  • 匿名函数 C++

    我正在尝试使用该功能signal int void int from
  • 在 Emacs Lisp 中检查字符串是否以后缀结尾

    是否有一个函数可以检查字符串是否以某个子字符串结尾 Python 有endswith http docs python org 2 library stdtypes html highlight endswith str endswith
  • 如何在 Flask-Login 中实现 user_loader 回调

    我正在尝试使用 Flask 和Flask 登录 http packages python org Flask Login在 Flask 应用程序中实现用户身份验证的扩展 目标是从数据库中提取用户帐户信息 然后登录用户 但我遇到了困难 但是