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

 

目录

一、引言 

二、FastAPI鉴权Authorization实战

2.1 Authorization鉴权—服务端

2.1.1 服务端源码

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

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

2.2 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鉴权如何开发,希望对大家有帮助。

《AI—工程篇》

AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效

AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署

AI智能体研发之路-工程篇(三):大模型推理服务框架Ollama一键部署

AI智能体研发之路-工程篇(四):大模型推理服务框架Xinference一键部署

AI智能体研发之路-工程篇(五):大模型推理服务框架LocalAI一键部署

《AI-模型篇》

AI智能体研发之路-模型篇(一):大模型训练框架LLaMA-Factory在国内网络环境下的安装、部署及使用

AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战

AI智能体研发之路-模型篇(三):中文大模型开、闭源之争

AI智能体研发之路-模型篇(四):一文入门pytorch开发

AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比

AI智能体研发之路-模型篇(六):【机器学习】基于tensorflow实现你的第一个DNN网络

AI智能体研发之路-模型篇(七):【机器学习】基于YOLOv10实现你的第一个视觉AI大模型

AI智能体研发之路-模型篇(八):【机器学习】Qwen1.5-14B-Chat大模型训练与推理实战

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值