【python】python指南(十三):FastAPI鉴权Authorization方法

简介: 【python】python指南(十三):FastAPI鉴权Authorization方法

一、引言

对于算法工程师来说,语言从来都不是关键,关键是快速学习以及解决问题的能力。大学的时候参加ACM/ICPC一直使用的是C语言,实习的时候做一个算法策略后台用的是php,毕业后做策略算法开发,因为要用spark,所以写了scala,后来用基于storm开发实时策略,用的java。至于python,从日常用hive做数据策略用python写udf,到基于tensorflow深度学习框架写python版的模型网络,再到现在实用pytorch做大模型。眼看着在语言纷争中,python的应用越来越广,开一个单独的专栏用于记录python中常用到的技巧,算是做笔记,没事翻出来看看。

Authorization(鉴权)是商用API的必要模块,通过分配api-key等鉴权方式,为账号及服务计费,以及分配对应的权限。

二、FastAPI鉴权Authorization实战

2.1 Authorization鉴权—服务端

2.1.1 服务端源码

采用Header函数处理请求头,通过alias指定提取请求头中Authorization对应的值作为api_key。代码如下

from fastapi import FastAPI, HTTPException, Depends, Header
from pydantic import BaseModel
 
# 创建 FastAPI 应用
app = FastAPI()
 
# 假设的 API 密钥数据库
api_keys = {
    "key1": "user1",
    "key2": "user2"
}
 
# 鉴权依赖项
async def authenticate(api_key: str = Header(..., alias="Authorization")):
    if api_key not in api_keys:
        raise HTTPException(status_code=401, detail="Unauthorized access")
    return api_key
 
# 示例请求模型
class RequestModel(BaseModel):
    prompt: str
 
# 示例响应模型
class ResponseModel(BaseModel):
    result: str
 
# 示例 API 路由
@app.post("/api", response_model=ResponseModel)
async def api_route(request: RequestModel, api_key: str = Depends(authenticate)):
    # 这里可以调用你的 AI 服务,处理 request.prompt 并返回结果
    result = "AI response for: " + request.prompt
    return {"result": result}

这个代码中,我们定义了一个鉴权依赖项 authenticate,它检查请求头中的 Authorization 字段是否包含有效的 API 密钥。如果密钥无效,将抛出一个 HTTP 401 Unauthorized 异常。在 API 路由中,我们使用了这个依赖项,确保只有通过鉴权的请求才能访问到 AI 服务。同时,我们定义了请求和响应的模型,以确保数据的正确性和一致性

2.1.2 如何理解api_key: str = Depends(authenticate)

  • 在 FastAPI 中,Depends 函数用于定义依赖项,这些依赖项可以是函数、类或其他可调用对象。当在路由处理函数的参数中使用 Depends 时,FastAPI 会自动调用这个依赖项,并将结果传递给参数。
  • 在你提到的 api_key: str = Depends(authenticate) 这行代码中,authenticate 是一个依赖项函数,它负责执行鉴权逻辑。这个函数接收请求头中的 Authorization 字段,并检查它是否包含有效的 API 密钥。如果密钥有效,authenticate 函数将返回这个密钥;如果密钥无效,它将抛出一个 HTTP 401 Unauthorized 异常。
  • 在路由处理函数中,api_key: str = Depends(authenticate) 这行代码告诉 FastAPI,这个函数需要一个有效的 API 密钥作为参数,并且应该使用 authenticate 函数来获取这个密钥。如果 authenticate 函数成功返回一个密钥,那么这个密钥将被传递给 api_key 参数;如果 authenticate 函数抛出异常,那么 FastAPI 将不会调用路由处理函数,而是直接返回异常信息。
  • 这样,你就可以在路由处理函数中使用 api_key 参数,而不需要担心鉴权逻辑。FastAPI 会自动处理鉴权,并确保只有通过鉴权的请求才能访问到你的 API。

2.1.3 如何理解api_key: str = Header(…, alias="Authorization")

  • 在 FastAPI 中,Header 是一个依赖项函数,用于从请求头中获取特定的值。api_key: str = Header(..., alias="Authorization") 这行代码告诉 FastAPI,你需要从请求头中获取 Authorization 字段的值,并将其作为 api_key 参数传递给函数。
  • Header 函数的参数 alias 用于指定请求头中的字段名。在这个例子中,alias="Authorization" 指定了 api_key 参数应该从请求头的 Authorization 字段中获取值。
  • Header 函数的参数 ... 是一个特殊的占位符,表示这个参数是必需的。如果请求头中没有 Authorization 字段,或者这个字段的值不符合预期,FastAPI 将抛出一个 HTTP 422 Unprocessable Entity 异常。
  • 在路由处理函数中,api_key: str = Header(..., alias="Authorization") 这行代码告诉 FastAPI,你需要从请求头中获取 Authorization 字段的值,并将其作为 api_key 参数传递给函数。然后,你可以在函数中使用 api_key 参数,例如,将其传递给鉴权函数,以检查 API 密钥是否有效。

2.2 Authorization鉴权—客户端

客户端使用python的requests处理http请求,在请求头headers中加入Authorization:api_key键值对。请求头中的Content-Type: application/json通常不用添加,因为当你使用 json 参数传递数据时,requests 会自动设置这个头。

import requests
import json
 
# API URL
url = "http://localhost:8000/api"
 
# API 密钥
api_key = "key1"
 
# 请求数据
data = {
    "prompt": "Hello, AI!"
}
 
# 构建请求头
headers = {
    "Authorization": api_key,
    "Content-Type": "application/json"
}
 
# 发送 POST 请求
response = requests.post(url, headers=headers, data=json.dumps(data))
 
# 打印响应内容
print(response.json())

三、总结

本文针对FastAPI的Authorization功能进行详细介绍,详细讲述了FastAPI服务端和客户端Authorization鉴权如何开发,希望对大家有帮助。


目录
相关文章
|
20天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
40 3
|
2月前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
|
8天前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
15天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
73 5
|
24天前
|
算法 决策智能 Python
Python中解决TSP的方法
旅行商问题(TSP)是寻找最短路径,使旅行商能访问每个城市一次并返回起点的经典优化问题。本文介绍使用Python的`ortools`库解决TSP的方法,通过定义城市间的距离矩阵,调用库函数计算最优路径,并打印结果。此方法适用于小规模问题,对于大规模或特定需求,需深入了解算法原理及定制策略。
34 15
WK
|
1月前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
77 36
|
22天前
|
机器学习/深度学习 人工智能 算法
强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用
本文探讨了强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用,通过案例分析展示了其潜力,并讨论了面临的挑战及未来发展趋势。强化学习正为游戏AI带来新的可能性。
58 4
|
28天前
|
Python
Python编程中的魔法方法(Magic Methods)
【10月更文挑战第40天】在Python的世界中,魔法方法就像是隐藏在代码背后的神秘力量。它们通常以双下划线开头和结尾,比如 `__init__` 或 `__str__`。这些方法定义了对象的行为,当特定操作发生时自动调用。本文将揭开这些魔法方法的面纱,通过实际例子展示如何利用它们来增强你的类功能。
14 1
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
11种经典时间序列预测方法:理论、Python实现与应用
本文将总结11种经典的时间序列预测方法,并提供它们在Python中的实现示例。
87 2
11种经典时间序列预测方法:理论、Python实现与应用
|
2月前
|
开发者 Python
Python中的魔法方法与运算符重载
在Python的奇妙世界里,魔法方法(Magic Methods)和运算符重载(Operator Overloading)是两个强大的特性,它们允许开发者以更自然、更直观的方式操作对象。本文将深入探讨这些概念,并通过实例展示如何利用它们来增强代码的可读性和表达力。