三周精通FastAPI:10 Cookie 参数 和Cookie 参数模型

官方文档:Cookie 参数 - FastAPI

定义 Cookie 参数与定义 Query 和 Path 参数一样。

源码:

from typing import Annotated

from fastapi import Cookie, FastAPI

app = FastAPI()


@app.get("/items/")
async def read_items(ads_id: Annotated[str | None, Cookie()] = None):
    return {"ads_id": ads_id}

首先,导入 Cookie

from fastapi import Cookie, FastAPI

声明 Cookie 参数的方式与声明 Query 和 Path 参数相同。第一个值是默认值,还可以传递所有验证参数或注释参数:

async def read_items(ads_id: Annotated[str | None, Cookie()] = None):

"技术细节"

Cookie 、Path 、Query 是兄弟类,都继承自共用的 Param 类。

注意,从 fastapi 导入的 QueryPathCookie 等对象,实际上是返回特殊类的函数。

"说明"

必须使用 Cookie 声明 cookie 参数,否则该参数会被解释为查询参数。

小结¶

使用 Cookie 声明 cookie 参数的方式与 Query 和 Path 相同。

Cookie参数模型



如果你有一组相关的Cookie,你可以创建一个Pydantic模型来声明它们。🍪
这将允许您在多个地方重用模型,并一次声明所有参数的验证和元数据。😎

注:
自FastAPI 0.115.0版本起支持此功能。🤓

小贴士
同样的技术也适用于Query、Cookie和Header。😎


具有Pydantic模型的Cookie


在Pydantic模型中声明所需的cookie参数,然后将该参数声明为cookie:

from typing import Annotated

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    session_id: str
    fatebook_tracker: str | None = None
    googall_tracker: str | None = None


@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
    return cookies

查看文档


您可以在/docs的文档UI中看到已定义的Cookie:


资讯
请记住,由于浏览器在幕后以特殊方式处理Cookie,因此它们不容易让JavaScript接触到它们。
如果您访问/docs上的API docs UI,您将能够看到路径操作的Cookie文档。
但是,即使您填写数据并单击“执行”,由于文档UI使用JavaScript,Cookie也不会被发送,您将看到一条错误消息,就像您没有写入任何值一样。


禁止额外Cookie


在某些特殊情况下(可能不是很常见),您可能希望限制您想要接收的Cookie。
您的API现在有权控制自己的cookie同意。🤪🍪
您可以使用Pydantic的模型配置来禁止任何额外的字段:

from typing import Annotated, Union

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    model_config = {"extra": "forbid"}

    session_id: str
    fatebook_tracker: Union[str, None] = None
    googall_tracker: Union[str, None] = None


@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
    return cookies

如果客户端尝试发送一些额外的Cookie,他们将收到错误响应。
可怜的cookie横幅,他们竭尽全力让API同意拒绝它。🍪
例如,如果客户端尝试发送一个值为good-list please的santa_tracker cookie,客户端将收到一个错误响应,告诉他们不允许使用santa_track cookie:

{ "detail": [ { "type": "extra_forbidden", "loc": ["cookie", "santa_tracker"], "msg": "Extra inputs are not permitted", "input": "good-list-please", } ] } 

摘要


您可以使用Pydantic模型在FastAPI中声明Cookie。😎

实践

又碰到问题了,这里是获得cookie,那么应该怎么来实践检验一下呢? 我认为需要先想办法把cookie存进去才行。

在测试中用浏览器发送cookie进去有点麻烦,需要按F12然后进行一些操作,那么问题就变成:

应该怎么用curl来发送带有cookie的请求?

后来发现curl可以用-b参数带cookie,如:

curl -X GET "http://127.0.0.1:8000/items/" -b "ads_id=12345" -b "another_cookie=67890"

curl -X GET "http://127.0.0.1:8000/items/" -b "session_id=abc123;fatebook_tracker=fb_track_123;googall_tracker=ga_track_456"

FastAPI cookie源码

将代码存为cookie.py文件

from typing import Annotated

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    # 禁止其它cookie
    model_config = {"extra": "forbid"}

    session_id: str
    fatebook_tracker: str | None = None
    googall_tracker: str | None = None


@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
    return cookies

启动服务

uvicorn cookie:app --reload

curl 进行cookie测试

执行curl命令和输出:

curl -X GET "http://127.0.0.1:8000/items/" -b "session_id=abc123;fatebook_tracker=fb_track_123;googall_tracker=ga_track_456"
{"session_id":"abc123","fatebook_tracker":"fb_track_123","googall_tracker":"ga_track_456"}

测试通过!

 

禁止额外cookie

代码写入cookie.py文件:

from typing import Annotated

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    # 禁止其它cookie
    model_config = {"extra": "forbid"}

    session_id: str
    fatebook_tracker: str | None = None
    googall_tracker: str | None = None


@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
    return cookies

 启动服务

uvicorn cookie:app --reload

curl 进行cookie测试

 

如果有超过设置的cookie,会报错

curl -X GET "htt.0.1:8000/items/" -b "session_id=abc123;test=test;fatebook_tracker=fb_track_123;googall_tracker=ga_track_456;temp=test"
{"detail":[{"type":"extra_forbidden","loc":["cookie","test"],"msg":"Extra inputs are not permitted","input":"test"},{"type":"extra_forbidden","loc":["cookie","temp"],"msg":"Extra inputs are not permitted","input":"test"}]}

如果直接用chromium浏览器浏览:http://127.0.0.1:8000/items/

因为浏览器会自动放一些cookie,所以也会报错:

{"detail":[{"type":"missing","loc":["cookie","session_id"],"msg":"Field required","input":{"CSRF-Token-5QWX4YR":"qThiWAbkWwNwXTA624FM3XUWZYkCujme","sessionid-5QWX4YR":"rhumGzAQQv9SmQobMdYcQKZgNpNFMgnK"}},{"type":"extra_forbidden","loc":["cookie","CSRF-Token-5QWX4YR"],"msg":"Extra inputs are not permitted","input":"qThiWAbkWwNwXTA624FM3XUWZYkCujme"},{"type":"extra_forbidden","loc":["cookie","sessionid-5QWX4YR"],"msg":"Extra inputs are not permitted","input":"rhumGzAQQv9SmQobMdYcQKZgNpNFMgnK"}]}

 

总结

 使用 Cookie 声明 cookie 参数的方式与 Query 和 Path 相同,写起来毫无压力!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP泵的比例流量控制阀放大器

01 PHP 05 PCS005、01 PHP 1 PCS005、01 PHP 2 PCS005、01 PHP 3 PCS005,01 FCV 2 M、01 FCV 3 M、01 PHP 05 PCLS005、01 PHP 1 PCLS005、01 PHP 2 PCLS005、01 PHP 3 PCLS005,FCV比例流量控制阀旨在与Berarma的PHP2和PHP3泵最佳集成,但由于…

戴尔电脑win11找不到D盘的解决办法

新公司给配的戴尔电脑,系统是win11,第一天用的好好地,第二天不知道什么原因,D盘找不到了,在网上搜了好多教程也没用,最后咨询客服,找到了解决办法 若【磁盘管理】界面看不到硬盘分区或无法进入…

比亚迪车机安装第三方应用教程

比亚迪车机安装第三方应用教程 比亚迪车机U盘安装APP, 无论是dlink3.0还是4.0都是安卓系统,因此理论上安卓应用是都可以安装的,主要就是横屏和竖屏的区别。在比亚迪上安装软件我主要推荐两种方法。 第一种,直接从电脑端下载安装布…

《计算机视觉》—— 基于dlib库的人检检测

文章目录 一、dlib库的安装1. 通过PyCharm的Settings安装2. 通过Anaconda安装(适用于Windows等操作系统)3. 通过命令行安装4.懒人安装 二、基于dlib库的人检测1.对图像进行人脸检测2.打开电脑摄像头,检测人脸 一、dlib库的安装 在PyCharm中&…

域渗透AD渗透攻击利用 MS14-068漏洞利用过程 以及域渗透中票据是什么 如何利用

目录 wmi协议远程执行 ptt票据传递使用 命令传递方式 明文口令传递 hash口令传递 票据分类 kerberos认证的简述流程 PTT攻击的过程 MS14-068 漏洞 执行过程 wmi协议远程执行 wmi服务是比smb服务高级一些的,在日志中是找不到痕迹的,但是这个主…

mongodb在linux下的部署

目录 版本部署上传到服务器中创建目录,解压创建mongodb.conf添加环境变量添加到系统服务中centos6 中添加到服务中 重新加载服务并启动卸载,mongodb.conf配置项等 创建用户,设置用户名密码角色启动验证验证 常见知识mongodb角色mongodb.conf配…

如何禁止上班期间浏览无关网站?

禁止员工在上班期间浏览无关网页主要是为了提升工作效率和生产力,确保员工能够专注于工作任务。同时,这种做法有助于降低网络安全风险,防止恶意软件和钓鱼攻击,减少数据泄露和法律风险,维护公司的专业形象,…

数据结构深度优先搜索遍历连通图+非连通图(C语言代码+遍历+终端输入内容)

首先数据结构(C语言版第二版)的关于深度优先搜索遍历连通图的图G4如下: 使用邻接表去创建上面这个无向图&#xff0c;然后再使用书本DFS函数以及DFSTraverse函数实现深度优先搜索遍历 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #…

微调大模型-2-Qwen基座模型使用

下载Qwen源码 Qwen作为中文支持非常nice的模型&#xff0c;很适合用于LLM学习。在云服务器里clone Qwen工程。 git clone https://github.com/QwenLM/Qwen2.5.git原始模型使用主要基于cli_demo.py-命令行调用&#xff0c;web_demo.py-网页调用。 预览这两个文件时&#xff0c…

Python | Leetcode Python题解之第497题非重叠矩形中的随机点

题目&#xff1a; 题解&#xff1a; class Solution:def __init__(self, rects: List[List[int]]):self.rects rectsself.sum [0]for a, b, x, y in rects:self.sum.append(self.sum[-1] (x - a 1) * (y - b 1))def pick(self) -> List[int]:k randrange(self.sum[-1…

vue3移动端可同时上传照片和视频的组件

uni-app中的uni-file-picker可单独上传照片或视频&#xff0c;但不支持同时上传照片和视频。本篇博客使用image标签和video标签实现移动端&#xff08;H5app小程序&#xff09;中照片和视频的同时上传。 本篇博客采用的是照片和视频的单独上传&#xff0c;但可同时展示&#xf…

Qt(简介)

1. Qt简介 Qt是一个基于C的图形用户界面&#xff08;GUI&#xff09;框架&#xff0c;可以开发可视化人机交互程序&#xff0c;但是这并不是Qt的全部。Qt除了可以绘制漂亮的界面外&#xff0c;还包含很多其他的功能&#xff1a;多线程、数据库、图像处理、音视频处理、网络通信…

后台管理员登录实现--系统篇

我的小系统后台原来就有一个上传图片的功能还夹带个删除图片的功能&#xff0c;还嵌到了一个菜单里面。之前效果如下 那么现在为了加大安全力度&#xff0c;想增加一个登录页面。通过登录再到这个页面。看着貌似很简单&#xff0c;但是听我细细说来&#xff0c;要新增些什么东西…

MySQL-视图 (ಥ_ಥ)

文本目录&#xff1a; ❄️一、什么是视图&#xff1a; ❄️二、创建视图&#xff1a; ❄️三、使用视图&#xff1a; ❄️四、修改数据&#xff1a; 1、注意事项&#xff1a; ❄️五、删除视图&#xff1a; ❄️六、视图的优点&#xff1a; ❄️总结&#xff1a; 对于这…

HT7179 26.8V,15A高效升压转换器

1、特征 输入电压范围:2.7V-25V 输出电压范围:最高26.8V 固定开关频率:350kHz 可编程峰值电流:最高15A 高转换效率1 95% (PVIN 12V, VOUT25V, IOUT 2A) 94%(PVIN 12V, VOUT25V, IOUT 4.5A) 93%(PVIN 7.2V, VOUT12V, IOUT 1.5A) 90% (PVIN 7.2V, VOUT12V, IOUT 5A) 96%(PVIN…

Perl打印9x9乘法口诀

本章教程主要介绍如何用Perl打印9x9乘法口诀。 一、程序代码 1、写法① use strict; # 启用严格模式&#xff0c;帮助捕捉变量声明等错误 use warnings; # 启用警告&#xff0c;帮助发现潜在问题# 遍历 1 到 9 的数字 for my $i (1..9) {# 对于每个 $i&#xff0c;遍历 1…

MoCoOp: Mixture of Prompt Learning for Vision Language Models

文章汇总 当前的问题 1)数据集风格变化。 如图1所示&#xff0c;对于一个数据集&#xff0c;单个软提示可能不足以捕获数据中呈现的各种样式。同一数据集中的不同实例可能与不同的提示符兼容。因此&#xff0c;更**自然的做法是使用多个提示来充分表示这些变化**。 2)过拟合…

V4L2驱动框架

文章目录 一、V4L2简介二、v4l2驱动关键组件&#xff08;一&#xff09;video_device结构体v4l2操作方法结构体v4l2的ioctl操作方法结构体 &#xff08;二&#xff09;v4l2_device结构体 一、V4L2简介 V4L2&#xff0c;即Video for Linux two&#xff0c;是Linux内核中用于视频…

qt项目使用其他项目的ui之单继承之成员变量

第一步添加.ui文件 第二步&#xff0c;点击编译(原理&#xff1a;qt的uic会将.ui界面编译成c文件) 第三步&#xff1a;在编译后的目录下找到#include “ui_pagewidget.h” 第四步&#xff1a; #ifndef USA_H #define USA_H#include <QWidget>#include "ui_pagew…

设计模式概览

设计模式是一种解决常见编程问题的经验总结&#xff0c;提供了代码的可重用性、可扩展性和可维护性。常见的设计模式有23个&#xff0c;主要分为三大类&#xff1a;创建型模式、结构型模式和行为型模式。下面是这三类设计模式的详细分类和讲解&#xff1a; 一、创建型模式 创建…