Fastapi 中的速率限制

2023-12-27

如何在 Fastapi 应用程序中对 API 端点请求进行速率限制?我需要对每个用户每秒 5 个请求的 API 调用进行速率限制,超过该限制会阻止该特定用户 60 秒。

在main.py中

def get_application() -> FastAPI:
     application = FastAPI(title=PROJECT_NAME, debug=DEBUG, version=VERSION)
     application.add_event_handler(
        "startup", create_start_app_handler(application))
     application.add_event_handler(
        "shutdown", create_stop_app_handler(application))
     return application
app = get_application()

在 events.py 中

def create_start_app_handler(app: FastAPI) -> Callable:  
    async def start_app() -> None:           

        redis = await aioredis.create_redis_pool("redis://localhost:8080")
        FastAPILimiter.init(redis)
    return start_app

在端点中

@router.post('/user',
             tags=["user"],
             name="user:user", dependencies=[Depends(RateLimiter(times=5, seconds=60))])
***code****

从该文件 test.py 运行。

import uvicorn

from app.main import app

if __name__ == "__main__":
    uvicorn.run("test:app", host="0.0.0.0", port=8000, reload=True)

我按照上面的方式编辑,但出现以下错误。

File "****ite-packages\starlette\routing.py", line 526, in lifespan
    async for item in self.lifespan_context(app):
  File "****site-packages\starlette\routing.py", line 467, in default_lifespan
    await self.startup()
  File "****site-packages\starlette\routing.py", line 502, in startup
    await handler()
  File "****app\core\services\events.py", line 15, in start_app
    redis = await aioredis.create_redis_pool("redis://localhost:8080")
  File "****\site-packages\aioredis\commands\__init__.py", line 188, in create_redis_pool
    pool = await create_pool(address, db=db,
  File "****site-packages\aioredis\pool.py", line 58, in create_pool
    await pool._fill_free(override_min=False)
  File "C****\site-packages\aioredis\pool.py", line 383, in _fill_free
    conn = await self._create_new_connection(self._address)
  File "****site-packages\aioredis\connection.py", line 111, in create_connection
    reader, writer = await asyncio.wait_for(open_connection(
  File "****\asyncio\tasks.py", line 455, in wait_for
    return await fut
  File "****\site-packages\aioredis\stream.py", line 23, in open_connection
    transport, _ = await get_event_loop().create_connection(
  File "****\asyncio\base_events.py", line 1033, in create_connection
    raise OSError('Multiple exceptions: {}'.format(
OSError: Multiple exceptions: [Errno 10061] Connect call failed ('::1', 8080, 0, 0), [Errno 10061] Connect call failed ('127.0.0.1', 8080)

最好的选择是使用库,因为 FastAPI 不提供开箱即用的此功能。

slowapi https://github.com/laurentS/slowapi很棒,而且很容易使用。

你可以像这样使用它。

from fastapi import FastAPI
from slowapi.errors import RateLimitExceeded
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address


limiter = Limiter(key_func=get_remote_address)
app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)

@app.get("/home")
@limiter.limit("5/minute")
async def homepage(request: Request):
    return PlainTextResponse("test")

@app.get("/mars")
@limiter.limit("5/minute")
async def homepage(request: Request, response: Response):
    return {"key": "value"}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fastapi 中的速率限制 的相关文章

随机推荐

  • 无法序列化数据表。未设置数据表名称

    我需要将所有数据表导出到单独的 XML 文件 但如果有一个巨大的表 我无法一次导出所有行 因为会出现 System OutOfMemoryException 所以我尝试导出N行 但是 如果我在查询中使用分页语法 WriteXml 会引发异常
  • 在 Shiny App 中使用下载的/外部文件

    我正在尝试创建一个闪亮的应用程序 它使用谷歌电子表格中外部可用的信息 我将其下载到临时 csv 文件中 该应用程序在我的本地计算机上运行正常 但是当我尝试将其推送到闪亮应用程序io http shinyapps io应用程序失败 我尝试使用
  • Elixir 是否支持内省以显示可用功能?

    考虑这个片段凤凰编程 https pragprog com book phoenix programming phoenix defmodule Rumbl VideoController do use Rumbl Web controll
  • DirectX11 使用 PNG CreateWICTextureFromMemory

    我目前已经使用 CreateWICTextureFromFile 加载纹理 但是我想要对其进行更多控制 并且我想将图像以字节形式存储在资源加载器中 下面只是两组测试代码 它们返回两个单独的结果 我正在寻找对可能的解决方案的任何见解 ID3D
  • C++0x线程中断

    根据 C 0x 最终草案 无法请求线程终止 也就是说 如果需要 我们需要实施一个 DIY 解决方案 另一方面 boost thread 提供了一种中断线程的机制 safe方式 您认为最好的解决方案是什么 设计自己的协作 中断机制 还是采用本
  • pydev:查找对函数的所有引用

    以前可能有人问过这个问题 但我似乎找不到答案 我已经从 Windows 迁移到 Linux 并最近开始使用 PyDev Aptana 但我似乎找不到如何找到对函数的所有引用 Ctrl Shift G 将查找 PyDev 中对函数的所有引用
  • API 平台 - UI 服务器端点定义

    有人可以帮忙吗API平台用户界面 在文档中 我无法找到定义服务器的方法 我希望服务器端点输出显示是否开启本地主机 dev or prod 有人可以帮忙解决这个问题吗 我在 Symfony 中使用它 我不确定它是否与路由文件夹中的 api p
  • 让 TeamCity 拉下所有 git 分支

    在构建服务器上 我设置了 TeamCity 8 1 1 以便在主分支 功能分支之一或使用分支说明符的拉取请求分支之一发生更改时执行构建过程 refs heads refs pull merge 我已经打开了构建代理选项 teamcity g
  • RxJava 和基于游标的 RESTful 分页

    我正在使用 Spotify API 并希望使用 RxJava 链接一些分页结果 Spotify 使用基于光标的分页 因此解决方案如下来自 lopar 的一个 https stackoverflow com a 29594194 377260
  • 在 ASP.NET 中添加表单身份验证声明

    我一直在开发一个 asp net 应用程序 它使用 windows azure 表作为用户信息的数据存储 我有一个类 它可以插入和创建表并处理其他内容 当我看到用户已经存在时 我想使用类似的东西发出身份验证令牌 FormsAuthentic
  • 在 Cordova/Phonegap 应用程序中实施 Stripe 支付网关

    搜索了很多 我想将 Stripe Payment Gateway 集成到我的 cordova 应用程序中 有什么方法可以使用 javascript 在 android 和 ios 中实现它 我给 stripe 发了邮件 显然如果你像在网络上
  • 如何告诉 Jackson 将“null”字符串反序列化为 null 文字?

    我有一个 Web 服务 它将 null 打印为任何属性的字符串 而不是 null 文字 它对几乎所有数据类型 字符串或日期 都执行此操作 例如 在理想情况下它返回 item title Some title expires 2014 11
  • $icon-font-path 在 bootstrap scss 中如何工作?

    我最近开始在我的节点项目上使用 bootstrap SCSS 所以我有app bower components bootstrap sass lib glyphicons scss例如 看看我的 CSS 输出 我看到如下内容 media s
  • 无法为 Visual Studio 2017 Professional 安装 SSDT

    需要你的帮助 我已经在我的电脑上成功安装了VS2017 但是当我尝试安装 SQL Server 数据工具 15 6 0 或 15 5 1 时 出现如下错误 设置失败 无法打开配置注册表项 0x800703F3 谢谢大家 SSDT 的最新版本
  • 如何查找具有特定 id 的元素是否存在

    在我的 JavaScript 中 我想检查具有特定 id 的元素是否存在 我尝试了两种方法 1 var myEle document getElementById myElement if myEle null var myEleValue
  • 为什么 .NET 中的许多命名集合没有实现 IEnumerable

    随机示例 ConfigurationElementCollection Net 有大量这样的小东西WhateverCollection未实现的类IEnumerable
  • Spring @Transactional 提交失败;德比 + Eclipselink

    以下是spring的配置 数据来源
  • 如何理解CAP定理的“可用性”?

    我不知道这是否是一个适当的问题 众所周知 在CAP定理中 A 表示 可用性 在维基百科 http en wikipedia org wiki CAP theorem 可用性 的解释是 Availability a guarantee tha
  • 将 ruby​​ 哈希值转换为 html 列表

    我正在尝试解析这样的 yaml 文件 a a1 a2 b b1 b11 b2 我得到这样的哈希值 a gt a1 gt nil a2 gt nil b gt b1 gt b11 gt nil b2 gt nil 我想把它变成一个列表 ul
  • Fastapi 中的速率限制

    如何在 Fastapi 应用程序中对 API 端点请求进行速率限制 我需要对每个用户每秒 5 个请求的 API 调用进行速率限制 超过该限制会阻止该特定用户 60 秒 在main py中 def get application gt Fas