FastAPI-Cookie

news2024/11/13 9:30:11

fastapi-learning-notes/codes/ch01/main.py at master · Relph1119/fastapi-learning-notes · GitHub

1、Cookie的作用

Cookie可以充当用户认证的令牌,使得用户在首次登录后无需每次手动输入用户名和密码,即可访问受限资源,直到Cookie过期或被手动清除。

2、查找Cookie

Google Chrome:

  1. 打开Chrome浏览器。
  2. 右上角点击三个点形成的菜单图标,选择“更多工具” > “开发者工具”(也可以直接按F12或Ctrl+Shift+I快捷键)。
  3. 在开发者工具窗口中,点击顶部的“Application”选项卡。
  4. 在左侧导航栏,展开“Cookies”部分,选择您想查看的网站域名。


 3、Cookie代码

下面这段代码使用FastAPI框架实现了一个简单的用户登录和用Cookie进行用户认证

  • 首先定义了一个User模型类,用于表示用户信息。
  • 创建了一个模拟的用户数据库fake_users_db,其中包含5个用户及其密码。
  • 定义了一个active_tokens字典,用于存储有效的会话令牌及其对应的用户名。
  • get_current_user函数用于验证Cookie中的会话令牌是否有效。如果有效,则返回对应的用户名;否则抛出HTTPException,表示无效的会话令牌。
  • login路由处理函数用于处理用户登录请求。首先验证用户凭据是否正确,如果正确,则生成一个随机的会话令牌,并将其与用户名关联起来,存储在active_tokens中。然后将该令牌设置为Cookie,并返回登录成功的信息以及相关数据。
  • protected_route路由处理函数是一个受保护的路由,只有携带有效会话令牌的请求才能访问。该函数依赖于get_current_user函数来验证用户身份,并返回欢迎信息。

最后,在主函数中使用uvicorn启动FastAPI应用程序。根据不同的模式,可以选择线上模式或调试模式运行

import secrets
import uvicorn
from fastapi import FastAPI, Depends, Cookie, HTTPException, Response
from pydantic import BaseModel

app = FastAPI()


# 用户模型
class User(BaseModel):
    username: str
    password: str


# 模拟的用户数据库,现在包含5个用户
fake_users_db = {
    "john_doe": {"username": "john_doe", "password": "secret_john"},
    "jane_smith": {"username": "jane_smith", "password": "secret_jane"},
    "alice": {"username": "alice", "password": "secret_alice"},
    "bob": {"username": "bob", "password": "secret_bob"},
    "charlie": {"username": "charlie", "password": "secret_charlie"}
}

# 假设这是存储token与其对应用户的简单字典
active_tokens = {}


def get_current_user(session_token: str = Cookie(None)):
    """
    验证Cookie中的session_token是否有效,这里是简化的版本,实际应用中应该有更安全的验证机制。
    """
    user = active_tokens.get(session_token)
    if user is not None:
        return user
    else:
        raise HTTPException(status_code=401, detail="Invalid session token")


@app.post("/login")
async def login(response: Response, user: User):
    if user.username in fake_users_db and user.password == fake_users_db[user.username]["password"]:
        token = secrets.token_hex(16)
        active_tokens[token] = user.username  # 将生成的token与用户名关联起来
        print("active_tokens:", active_tokens)
        response.set_cookie(key="session_token", value=token, max_age=60 * 60 * 24)
        return {"username": user.username,
                "password": user.password,
                "token": token,
                "active_tokens": active_tokens,
                "message": f"Login successful for user {user.username}"}

    else:
        raise HTTPException(status_code=401, detail="Incorrect username or password")


@app.get("/protected-route")
async def protected_route(user: str = Depends(get_current_user)):
    """
    受保护的路由,只有携带有效Cookie的请求才能访问
    """
    return {"message": f"Welcome back, {user}!"}


# 主函数,用于启动FastAPI应用程序
if __name__ == "__main__":
    ## 线上模式
    # uvicorn.run("abr_server:app", host="0.0.0.0", port = 1218)

    ## debug 模式
    uvicorn.run("test5:app", host="0.0.0.0", port=1220, reload=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1877753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hi3861 OpenHarmony嵌入式应用入门--LiteOS Semaphore做同步使用

信号量作为同步使用 创建一个Semaphore对象,并指定一个初始的计数值(通常称为“许可”或“令牌”的数量)。这个计数值表示当前可用的资源数量或可以同时访问共享资源的线程数。当一个线程需要访问共享资源时,它会尝试从Semaphore…

c++用什么软件编程?都有哪些?

c用什么软件编程?都有哪些? C 作为一种高效、面向对象的编程语言,广泛应用于软件开发、游戏开发、嵌入式系统等领域。那么在进行 C 编程时,我们通常会使用哪些软件呢?下面就来具体分析。 1. Visual Studio Visual Stu…

python selenium 打开网页

selenium工具类 - 文件名 seleniumkit.py 代码如下 # -*- coding:utf-8 _*-from selenium import webdriverimport os import timefrom selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from seleniu…

【计算机网络】期末复习(2)

目录 第一章:概述 第二章:物理层 第三章:数据链路层 第四章:网络层 第五章:传输层 第一章:概述 三大类网络 (1)电信网络 (2)有线电视网络 &#xff0…

Eclipse + GDB + J-Link 的单片机程序调试实践

Eclipse GDB J-Link 的调试实践 本文介绍如何创建Eclipse的调试配置,如何控制调试过程,如何查看修改各种变量。 对 Eclipse 的要求 所用 Eclipse 应当安装了 Eclipse Embedded CDT 插件。从 https://www.eclipse.org/downloads/packages/ 下载 Ecli…

快手正式推出Vision Pro版本,引领虚拟现实社交新潮流

6月28日,快手正式推出其专为Apple Vision Pro打造的版本——快手vp版app,成为国内首批登陆Apple Vision Pro的短视频平台。 借助先进的虚拟现实技术,用户可以在快手上体验更真实生动的视频内容,无论是观看趣味短视频内容&#xf…

怎样查看自己的Windows电脑最近弄了哪些内容

一、需求说明 有时候我们的电脑别人需要使用,你不给他使用又不行,且你也不在电脑身边,你只能告诉他自己的电脑密码让他操作,此时你并不不知道他操作了哪些内容。 还有一个种情况是自己不在电脑旁边,且电脑没有锁屏&…

鳗鱼-石斑鱼优化算法(EGO)-鲸鱼算法作者又提出新算法!公式原理详解与性能测评 Matlab代码免费获取

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 原理简介 一、石斑鱼追踪猎物(勘探阶段) 二…

QGroundControl@Jetson Orin Nano - 从代码编译安装

QGroundControlJetson Orin Nano - Build from Source 1. 源由2. 步骤2.1 QT 编译2.1.1 下载2.1.2 版本2.1.3 初始化2.1.4 配置2.1.5 编译2.1.6 安装 2.2 QGC 编译2.2.1 下载2.2.2 版本2.2.3 初始化2.2.4 配置2.2.5 编译2.2.6 安装2.2.7 QT5命令备注 3. 可行方案4. 总结5. 补充…

如何用GPT开发一个基于 GPT 的应用?

原文发自博客:GPT应用开发小记 如何开发一个基于 GPT 的应用?答案就在问题里,那就是用 GPT 来开发基于 GPT 的应用。本文以笔者的一个开源项目 myGPTReader 为例,分享我是如何基于 GPT 去开发这个系统的,这个系统的功能…

Typora failed to export as pdf. undefined

变换版本并没有用,调整图片大小没有用 我看到一个博客后尝试出方案 我的方法 解决:从上图中的A4,变为其他,然后变回A4 然后到处成功,Amazing! 参考: Typora 导出PDF 报错 failed to export…

Tesseract Python 图片文字识别入门

1、安装tesseract Index of /tesseract https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.3.0.20221214.exe 2、安装中文语言包 https://digi.bib.uni-mannheim.de/tesseract/tessdata_fast/ 拷贝到C:\Program Files\Tesseract-OCR\tessdata 3、注…

《重构》读书笔记【第1章 重构,第一个示例,第2章 重构原则】

文章目录 第1章 重构,第一个示例1.1 重构前1.2 重构后 第2章 重构原则2.1 何谓重构2.2 两顶帽子2.3 为何重构2.4 何时重构2.5 重构和开发过程 第1章 重构,第一个示例 我这里使用的IDE是IntelliJ IDEA 1.1 重构前 plays.js export const plays {&quo…

springcloud第4季 springcloud-alibaba之nacos+openfegin+gateway+sentinel熔断限流【经典案例】

一 说明 1.1 架构说明 本案例实现原理: 采用alibaba的nacos,openfegin,sentinel,gateway等组件实现熔断限流。 主要理解sentinel的ResouceSentinel和fallback的区别联系。 ResourceSentinel 主要是页面配置熔断限流规则&#…

海康+libtorch的血泪教训

一、LibTorch使用, 详见: /INCLUDE:?warp_sizecudaatYAHXZ 二、海康二次开发, 目前选4.31,只能c14。 三、做dll注意:

实用的vueuseHooks,提高编码效率

文章目录 写在前面vueuse 官网安装HooksuseStorage [地址](https://vueuse.org/core/useStorage/)传统方法数据持久化 举例子传统持久化的弊端useStorage 数据持久化 举例子使用useStorage 更改存储数据使用useStorage 删除存储数据 useScriptTag [地址](https://vueuse.org/co…

FinalShell:功能强大的 SSH 工具软件,Mac 和 Win 系统的得力助手

在当今数字化的时代,SSH 工具软件成为了许多开发者、运维人员以及技术爱好者不可或缺的工具。而 FinalShell 作为一款出色的中文 SSH 工具软件,无论是在 Mac 系统还是 Windows 系统上,都展现出了卓越的性能和便捷的使用体验。 FinalShell 拥…

go语言DAY7 字典Map 指针 结构体 函数

Go中Map底层原理剖析_go map底层实现-CSDN博客 目录 Map 键值对key,value 注意: map唯一确定的key值通过哈希运算得出哈希值 一、 map的声明及初始化: 二、 map的增删改查操作: 三、 map的赋值操作与切片对比: 四、 通用所有…

深入探讨C++的高级反射机制

反射是一种编程语言能力,允许程序在运行时查询和操纵对象的类型信息。它广泛应用于对象序列化、远程过程调用、测试框架、和依赖注入等场景。 由于C语言本身的反射能力比较弱,因此C生态种出现了许多有趣的反射库和实现思路。我们在本文一起探讨其中的奥秘…

深入解析内容趋势:使用YouTube API获取视频数据信息

一、引言 YouTube,作为全球最大的视频分享平台之一,汇聚了无数优质的内容创作者和观众。从个人分享到专业制作,从教育科普到娱乐休闲,YouTube上的视频内容丰富多彩,满足了不同用户的需求。对于内容创作者、品牌以及希…