如果用户未使用 FastAPI-Login 包登录,则重定向到登录页面

2024-03-18

我想在用户未登录时将他们重定向到登录页面。

这是我的代码:

from fastapi import (
    Depends,
    FastAPI,
    HTTPException,
    status,
    Body,
    Request
)
from fastapi.encoders import jsonable_encoder
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from fastapi.responses import HTMLResponse, RedirectResponse
import app.models as models
import app.database as database
from datetime import datetime, timedelta
from jose import JWTError, jwt
from starlette.responses import FileResponse
from fastapi_login import LoginManager
from fastapi_login.exceptions import InvalidCredentialsException
from fastapi import Cookie
import re

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
manager = LoginManager(SECRET_KEY, token_url="/auth/login", use_cookie=True)
manager.cookie_name = "token"


@app.get("/")
@app.get("/item")
async def read_index(user=Depends(manager)):
    try:
        return FileResponse('item.html')
    except status.HTTP_401_UNAUTHORIZED:
        return RedirectResponse(url="/login", status_code=status.HTTP_302_FOUND)

但是,当我访问此页面时:localhost:8000/item,我得到以下信息:

{"detail":"Not authenticated"}

从您提供的代码片段来看,您似乎正在使用(第三方)FastAPI-Login https://github.com/MushroomMaula/fastapi_login包裹。他们的文档 https://fastapi-login.readthedocs.io/advanced_usage/#exception-handling建议使用自定义Exception on the LoginManager实例,可用于将用户重定向到login页面,如果他们没有登录。

工作示例:

下面的认证是基于cookies https://fastapi-login.readthedocs.io/advanced_usage/#cookies,但您可以将令牌传递给Authorization标题也是如此。导航/protected未登录时的路由以使重定向生效。

from fastapi import FastAPI, Depends, Request, Response, status
from starlette.responses import RedirectResponse, HTMLResponse, JSONResponse
from fastapi.security import OAuth2PasswordRequestForm
from fastapi_login.exceptions import InvalidCredentialsException
from fastapi_login import LoginManager

class NotAuthenticatedException(Exception):
    pass
    
app = FastAPI()
SECRET = "super-secret-key"
manager = LoginManager(SECRET, '/login', use_cookie=True, custom_exception=NotAuthenticatedException)


DB = {
    'users': {
        '[email protected] /cdn-cgi/l/email-protection': {
            'name': 'John Doe',
            'password': 'hunter2'
        }
    }
}

def query_user(user_id: str):
    return DB['users'].get(user_id)


@manager.user_loader()
def load_user(user_id: str):
    user = DB['users'].get(user_id)
    return user
    
 
@app.exception_handler(NotAuthenticatedException)
def auth_exception_handler(request: Request, exc: NotAuthenticatedException):
    """
    Redirect the user to the login page if not logged in
    """
    return RedirectResponse(url='/login')
    

@app.get("/login", response_class=HTMLResponse)
def login_form():
    return """
    <!DOCTYPE html>
    <html>
       <body>
          <form method="POST"  action="/login">
             <label for="username">Username:</label><br>
             <input type="text" id="username" name="username" value="[email protected] /cdn-cgi/l/email-protection"><br>
             <label for="password">Password:</label><br>
             <input type="password" id="password" name="password" value="hunter2"><br><br>
             <input type="submit" value="Submit">
          </form>
       </body>
    </html>
    """

    
@app.post('/login')
def login(data: OAuth2PasswordRequestForm = Depends()):
    email = data.username
    password = data.password
    user = query_user(email)
    if not user:
        # you can return any response or error of your choice
        raise InvalidCredentialsException
    elif password != user['password']:
        raise InvalidCredentialsException

    token = manager.create_access_token(data={'sub': email})
    response = RedirectResponse(url="/protected",status_code=status.HTTP_302_FOUND)
    manager.set_cookie(response, token)
    return response


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

如果用户未使用 FastAPI-Login 包登录,则重定向到登录页面 的相关文章

  • 由于“环境错误:[错误 13]:权限被拒绝:'usr/local/bin/f2py'”而无法安装软件包

    我正在尝试在 macOS X 上安装 numpy 但执行命令后pip install numpy我收到错误 环境错误 错误13 权限被拒绝 usr local bin f2py 我如何解决它 这对我有用 pip3 install user
  • 相当于 java PBKDF2WithHmacSHA1 的 Python

    我的任务是构建一个 API 的使用者 该 API 需要带有 UNIX 时间种子值的加密令牌 我看到的示例是使用我不熟悉的 Java 实现的 在阅读文档和其他堆栈文章后一直无法找到解决方案 使用javax crypto SecretKey j
  • Python 3 中的递归搜索 JSON/DICT

    我在 Python 3 中实现了一些 API 这些 API 允许我根据班级代码接收有关学校的信息 但我想知道如何通过类代码获取信息 例子 我输入代码GF528S我希望程序告诉我班级 3C INF 地址 Address 1 Milan 如果可
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 如何阻止 Django 中发生级联删除?

    我的 Django 应用程序中有三个模型类 class Folder models Model folder models ForeignKey Folder null True blank True related name folder
  • 有没有办法清理 jinja2 生成的 html?

    我们使用 jinja2 来创建 html 但是 由于我们在 jinja 中执行许多循环和其他操作来生成 html 所以 html 看起来 很丑 注意 这只是为了美观 我们可以做些什么来清理 html 吗 除了清理我们的 jinja2 代码之
  • Python:按条件绘制多个正/负条形图

    这是我第一次用 python 绘制条形图 我的 df 操作 key descript score 0 noodles taste 5 1 noodles color 2 2 noodles health 3 3 apple color 7
  • Twython - 如何使用媒体 url 更新状态

    在我的应用程序中 我允许用户在 Twitter 上发帖 现在我想让他们通过媒体更新他们的状态 In twython py我看到一个方法update status with media从文件系统读取图像并上传到 Twitter 我的图像不在文
  • Scrapy 未通过请求回调从项目中的已抓取链接返回附加信息

    基本上 下面的代码会抓取表格的前 5 项 其中一个字段是另一个 href 单击该 href 会提供更多信息 我想收集这些信息并将其添加到原始项目中 所以parse应该将半填充的项目传递给parse next page然后刮掉下一位并返回完成
  • 使用 PRAW 帮助获取 Reddit 帖子链接到的 URL

    我正在尝试使用 Praw 获取 Reddit 提交标题中链接的帖子 例如提交 http www reddit com r AdviceAnimals comments 1adu71 apparently people still need
  • Python Raspberry pi - 如果路径不存在,则跳过循环

    我有一个收集温度 文本文件中的值 的功能 它使用部分预定义的路径 但是 有时如果温度传感器未加载 断开连接 则路径不存在 如果路径不可用 如何设置条件或例外来跳过循环 我想使用 continue 但我不知道要设置什么条件 def read
  • Flask-Mail - 基于 Flask-Cookiecutter 异步发送电子邮件

    我的烧瓶项目基于烧瓶饼干切割机 https github com sloria cookiecutter flask我需要异步发送电子邮件 发送电子邮件的功能由以下配置米格尔的教程 https blog miguelgrinberg com
  • Keras ImageDataGenerator 相当于 csv 文件

    我在文件夹中排序了一堆数据 如下图所示 我需要构建一个 DataIterator 以便将数据放入神经网络模型中 当数据是图像时 我找到了很多例子来解决这个问题 使用 Keras 类图像数据生成器及其方法流自目录 但当数据是 csv 结构时则
  • 如何编辑 QProgressBar 的样式表

    我无法在我的应用程序中编辑进度条的颜色 仅编辑文本颜色 pyhton 3 9 PySide6 QT Creator 7 0 2 Python应用程序 https i stack imgur com 6hKFI png import sys
  • 在 Python 中快速确定小于 10 亿的数字是否为素数

    我目前在 python 中检查数字素数的算法对于 1000 万到 10 亿之间的数字来说速度很慢 我希望它能够得到改进 因为我知道我永远不会得到超过 10 亿的数字 背景是我无法获得足够快的实现来解决项目 Euler 的问题 60 我在 7
  • 如何在 VS Code 宏中将焦点返回到编辑器,将 Python 文本发送到调试控制台?

    我尝试按键绑定宏以将 python 文本发送到调试控制台并将焦点返回到 Visual Studio Code 中的编辑器 这是我尝试过的 安装了vscode python https marketplace visualstudio com
  • 如何在 Python 中将 .docx 转换为 .txt

    我想将大量 MS Word 文件转换为纯文本格式 我不知道如何在 Python 中做到这一点 我在网上找到了以下代码 我的路径是本地路径 所有文件名都类似于 cx xxx 即 c1 000 c1 001 c2 000 c2 001 等 fr
  • 从多个大型 NetCDF 文件中提取数据的快速/高效方法

    我只需要从全局网格中提取特定节点集的数据 由纬度 经度坐标 按 5000 10000 的顺序 给出 这些数据是水力参数的时间序列 例如波高 全局数据集很大 因此分为许多 NetCDF 文件 每个 NetCDF 文件大小约为 5GB 包含整个
  • Django:单击按钮加载另一个模板

    我已经在 django 项目上工作了几个星期 只是玩玩以便掌握它的窍门 我有点困惑 我现在有一个名为 home html 的模板 我想知道是否可以将另一个名为 profile html 的模板设置为 home html 模板上的链接 我有一
  • 重定向到破折号中的 url

    我正在使用 dash 构建一个仪表板 每当单击特定数据点时 我都会创建一个唯一的 url 如何将用户重定向到此创建的 url 我正在使用下面给出的代码 每当有人单击任何数据点时 单击事件就会触发并执行回调函数 app layout html

随机推荐

  • Swift:按下 UITabBarItem 时如何执行操作

    目前我有一个连接到表格视图控制器的选项卡栏控制器 当我按下标签栏项目时 我试图转到表格视图的顶部 我知道如何到达桌面视图的顶部 我只是不知道按下该项目时如何执行操作 你应该使用UITabBarDelegate用方法didSelectItem
  • 如何正确使用 codeigniter 发送电子邮件的方式

    嘿伙计 我正在尝试使用 codeigniter 邮件类函数发送电子邮件 但我发现 smtp 协议有问题 我使用gmail smtp协议 我在本地机器上运行这个 我正在使用 Xampp 1 7 4 包 并且我尝试过如下设置 function
  • .htaccess 将图像从旧文件夹重定向到新文件夹

    我刚刚从 Drupal Wordpress 迁移到完全用 WordPress 构建的网站 我有一组图像 其中文件不再存在 需要尝试将所有图像保留在一个文件夹中 如果可能 我需要发送对任何 gif png jpg 的请求http www do
  • Innosetup 添加多个 exe 文件并在主设置中执行

    我想知道如何添加额外的安装 exe 并使用 innosetup 与我的主 exe 一起执行额外的 exe 请帮助我 因为我在过去 3 天里一直在尝试这个 因为我是 innosetup 的新手 谢谢 最简单的方法是在 Run 部分调用附加的
  • CouchDB 文档更新处理程序(就地更新)

    http wiki apache org couchdb Document Update Handlers http wiki apache org couchdb Document Update Handlers CouchDB 0 10
  • 如何切换不同版本的gem安装?

    我在本地计算机上安装了三个版本的机架 rack 1 4 1 1 3 6 1 3 5 对于某些宝石 例如Cucumber 它需要较低版本rack被激活 我尝试过bundle但也没有什么好处 执行时 cucumber仍将使用激活的机架版本1 4
  • 反汇编Java字节码的Java程序[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我最近正在阅读有关字节码分析的内容 我需要以下查询的帮助 如果我想编写一个反汇编 Java 字节码 通过读取类文件 并打印操作码的 J
  • 如何在 MVC 4 中实现自定义 OpenID 依赖方

    我喜欢新的 MVC OpenID OAuth 登录功能 但我想知道如何添加新的登录按钮 例如我希望我的用户使用他们的 StackExchange 帐户或使用他们的 OpenID url 登录 就像在 stackoverflow 中一样htt
  • Fiddler 重新发行以及作曲家编辑和重新发行

    我在日常生活中使用 Fiddler 然而 对我来说最常用的功能 例如Reissue and Edit and Reissue from composer没有任何捷径 我不知道如何为此使用 fiddler 脚本 有人能指出这个问题的解决方案吗
  • 如何使用 Material ui Reactjs 禁用今天日期中的过去日期?

    我正在使用 React Material ui 创建日期范围选择器 我此功能背后的逻辑是选择所需日期 如果已选择所需日期 则禁用所选日期中的所有过去日期 如何实现这个react材质ui 这是我的代码 import React from re
  • struts 2将属性标签的值分配给隐藏字段

    我想将字段描述中的值分配给隐藏字段测试 但问题是 描述 包含单词序列 并且以下代码仅将第一个单词分配给 测试
  • 何时考虑 Solr

    我正在开发一个应用程序 需要通过搜索来做有趣的事情 包括全文搜索 命中突出显示 分面搜索等 该数据集可能有 3000 10000 条记录 每条记录有 20 30 个字段 并且全部存储在 MySQL 中 该网站的流量概况可能是中小型 所有这些
  • 如何将可绘制图像附加到 Gmail?

    我正在尝试将 gridview 中的图像附加到 gmail 或 facebook 但是每当我尝试附加应用程序时就会崩溃 并且我收到以下带有空指针异常的错误 以下是我使用 gridview 图像选择的代码 有人可以帮忙吗 public cla
  • VSCodium - Python 模块没有绿色语法

    最近 我正在尝试从 VSCode 迁移到 VSCodium 我发现一个问题是VSCodium中没有模块的绿色着色 如下图所示 左 VSCode 具有绿色语法 右 VSCodium 没有绿色语法 我在网上看到一些其他的截图 他们的 VSCod
  • java.time.ZonedDateTime.parse 和 iso8601?

    为什么 JDK8 DateTime 库似乎无法解析有效的 iso8601 日期时间字符串 它因表示为 01 而不是 01 00 的时区偏移而阻塞 这有效 java time ZonedDateTime parse 2015 08 18T00
  • 在 Thymeleaf 方言处理器中访问 HttpServletRequest 和 HttpServletResponse

    我正在尝试创建一个执行 ServletDispatcher include 的 Thymeleaf 方言处理器 我扩展了 AbstractElementTagProcessor 并重写了 doProcess 方法 相关代码片段是 Overr
  • 从中间件调用控制器的操作方法

    我的中间件类位于不同的类库项目中 控制器位于不同的项目中 我正在尝试做的事情是 如果不满足特定条件 则从中间件重定向到自定义控制器 操作方法 但是 我无法使用 Response Redirect 方法来做到这一点 我怎样才能在中间件类中做到
  • 无法在 Go 代码中获取 AWS EKS 集群的 kubeconfig

    我已经创建了一个 AWS EKS 集群 为了获取它的 kubeconfig 我通常运行aws eks update kubeconfig name cluster name region us west 2使用外壳 但是 我现在希望在 Go
  • Docker-compose 命名挂载卷

    为了跟踪 docker compose 使用的卷 我想使用命名卷 这对于 正常 卷非常有效 例如 version 2 services example app volume named vol dir in container volume
  • 如果用户未使用 FastAPI-Login 包登录,则重定向到登录页面

    我想在用户未登录时将他们重定向到登录页面 这是我的代码 from fastapi import Depends FastAPI HTTPException status Body Request from fastapi encoders