0%

通过Python调用OpenAI API的实战

在人工智能时代,OpenAI提供的API服务为开发者提供了强大的AI能力。无论是聊天机器人、图像生成、语音处理还是代码生成,OpenAI API都能提供高效、准确的解决方案。本文将详细介绍如何使用Python调用OpenAI API,包括依赖库、调用方法、代码示例以及可能出现的错误和解决方案。

一、依赖的库

要使用Python调用OpenAI API,我们需要安装OpenAI官方提供的Python库。

1. openai

openai是OpenAI官方提供的Python客户端库,用于简化API调用流程。它封装了各种API端点,提供了便捷的方法来调用OpenAI的各种服务。

安装方法

1
pip install openai

版本要求

  • 推荐使用最新版本,以获得最佳性能和最新功能
  • 目前稳定版本:v1.35.10(截至2026年1月)

二、调用方法

1. 基本配置

在使用OpenAI API之前,需要进行基本配置,主要是设置API密钥。

步骤1:获取API密钥

步骤2:设置API密钥

方法1:直接在代码中设置

1
2
3
4
5
6
from openai import OpenAI

# 初始化客户端
client = OpenAI(
api_key="your-api-key-here" # 替换为你的API密钥
)

方法2:使用环境变量(推荐)

1
2
3
4
5
6
7
import os
from openai import OpenAI

# 从环境变量获取API密钥
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY")
)

设置环境变量的方法:

  • Windows:setx OPENAI_API_KEY "your-api-key-here"
  • Linux/macOS:export OPENAI_API_KEY="your-api-key-here"

2. 聊天完成(Chat Completions)

聊天完成是OpenAI API中最常用的功能,用于生成对话式响应。

基本调用示例

1
2
3
4
5
6
7
8
9
10
11
# 调用聊天完成API
response = client.chat.completions.create(
model="gpt-4o", # 使用的模型
messages=[
{"role": "system", "content": "你是一个 helpful 的助手。"},
{"role": "user", "content": "介绍一下Python的主要特点。"}
]
)

# 输出响应结果
print(response.choices[0].message.content)

参数说明

  • model:使用的模型名称,如gpt-4ogpt-3.5-turbo
  • messages:对话历史,包含角色(system/user/assistant)和内容
  • temperature:控制生成文本的随机性,范围0-2,值越高越随机
  • max_tokens:生成文本的最大令牌数

3. 图片生成(Image Generation)

OpenAI API提供了图片生成功能,可以根据文本描述生成图片。

基本调用示例

1
2
3
4
5
6
7
8
9
10
11
12
# 调用图片生成API
response = client.images.generate(
model="dall-e-3", # 使用的模型
prompt="一只可爱的柯基犬在草地上奔跑,阳光明媚,水彩画风格", # 图片描述
size="1024x1024", # 图片尺寸
quality="standard", # 图片质量
n=1, # 生成图片数量
)

# 获取图片URL
image_url = response.data[0].url
print(f"生成的图片URL:{image_url}")

参数说明

  • model:使用的模型,如dall-e-3dall-e-2
  • prompt:图片描述,越详细生成效果越好
  • size:图片尺寸,如1024x10241792x1024
  • quality:图片质量,standardhd
  • n:生成图片数量,范围1-10

4. 语音转文本(Speech to Text)

OpenAI API提供了语音转文本功能,可以将音频文件转换为文本。

基本调用示例

1
2
3
4
5
6
7
8
9
10
# 调用语音转文本API
with open("audio.mp3", "rb") as audio_file:
response = client.audio.transcriptions.create(
model="whisper-1", # 使用的模型
file=audio_file, # 音频文件
response_format="text" # 输出格式
)

# 输出转换结果
print(f"转换结果:{response}")

参数说明

  • model:使用的模型,目前主要是whisper-1
  • file:音频文件对象
  • response_format:输出格式,如textjsonsrt
  • language:音频语言,可选参数,如zhen

三、完整代码示例

1. 聊天完成完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import os
from openai import OpenAI

# 初始化客户端
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY")
)

def chat_completion_example():
"""聊天完成示例"""
try:
# 调用API
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个Python编程助手。"},
{"role": "user", "content": "写一个Python函数,用于计算斐波那契数列的第n项。"}
],
temperature=0.7,
max_tokens=500
)

# 输出结果
print("\n=== 聊天完成示例 ===")
print("问题:写一个Python函数,用于计算斐波那契数列的第n项。")
print(f"回答:{response.choices[0].message.content}")

except Exception as e:
print(f"错误:{e}")

if __name__ == "__main__":
chat_completion_example()

2. 图片生成完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import os
from openai import OpenAI

# 初始化客户端
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY")
)

def image_generation_example():
"""图片生成示例"""
try:
# 调用API
response = client.images.generate(
model="dall-e-3",
prompt="一只可爱的柯基犬在草地上奔跑,阳光明媚,水彩画风格",
size="1024x1024",
quality="standard",
n=1,
)

# 输出结果
print("\n=== 图片生成示例 ===")
print(f"生成的图片URL:{response.data[0].url}")

except Exception as e:
print(f"错误:{e}")

if __name__ == "__main__":
image_generation_example()

四、常见错误及解决方案

1. API密钥错误

错误信息openai.AuthenticationError: Invalid authentication credentials

解决方案

  • 检查API密钥是否正确,确保没有多余的空格或换行符
  • 确保API密钥没有过期或被撤销
  • 检查环境变量是否正确设置

2. 请求频率限制

错误信息openai.RateLimitError: Rate limit exceeded

解决方案

  • 减少请求频率,添加适当的延迟
  • 考虑升级API套餐,提高速率限制
  • 使用指数退避策略处理重试

3. 模型不存在

错误信息openai.BadRequestError: The model 'gpt-5' does not exist

解决方案

  • 检查模型名称是否正确
  • 确认你有权限访问该模型
  • 查看OpenAI官网文档,了解可用的模型列表

4. 输入格式错误

错误信息openai.BadRequestError: Invalid input format

解决方案

  • 检查请求参数是否符合API要求
  • 确保messages格式正确,包含role和content字段
  • 检查文件格式是否支持(如语音转文本)

5. 上下文窗口超出

错误信息openai.BadRequestError: This model's maximum context length is 128000 tokens

解决方案

  • 减少输入文本长度
  • 使用更适合长文本的模型
  • 实现对话历史截断机制

五、进阶用法

1. 异步调用

对于高并发场景,可以使用异步调用提高效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
import asyncio
from openai import AsyncOpenAI

# 初始化异步客户端
async_client = AsyncOpenAI(
api_key=os.getenv("OPENAI_API_KEY")
)

async def async_chat_completion():
"""异步聊天完成"""
response = await async_client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "介绍一下异步编程的优势。"}
]
)
return response.choices[0].message.content

# 执行异步函数
async def main():
result = await async_chat_completion()
print(result)

asyncio.run(main())

2. 流式响应

对于长时间运行的请求,可以使用流式响应实时获取结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import os
from openai import OpenAI

client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY")
)

def streaming_chat_completion():
"""流式聊天完成"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "写一个Python函数,用于生成100以内的素数。"}
],
stream=True # 启用流式响应
)

print("\n=== 流式响应示例 ===")
print("回答:", end="")

# 逐块获取响应
for chunk in response:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="")

if __name__ == "__main__":
streaming_chat_completion()

3. 自定义代理

如果在受限网络环境下,可以设置自定义代理。

1
2
3
4
5
6
from openai import OpenAI

client = OpenAI(
api_key="your-api-key-here",
base_url="https://your-proxy-server.com/v1" # 自定义代理URL
)

六、总结

通过Python调用OpenAI API是一项强大的技能,可以为各种应用提供AI能力。本文介绍了OpenAI库的安装和配置,详细说明了聊天完成、图片生成、语音转文本等常见功能的调用方法,并提供了完整的代码示例。同时,我们还讨论了常见错误及解决方案,以及异步调用、流式响应等进阶用法。

在实际应用中,需要根据具体需求选择合适的模型和参数,并注意API密钥的安全管理。随着OpenAI API的不断更新,建议定期查看官方文档,了解最新功能和最佳实践。

希望本文能够帮助你掌握Python调用OpenAI API的技能,为你的项目开发提供便利!

七、参考资料

  1. OpenAI官方文档
  2. OpenAI Python库文档
  3. OpenAI API密钥管理
  4. OpenAI模型列表
  5. OpenAI API速率限制

通过Python调用邮件服务的实战

在现代软件开发中,自动发送邮件是一项常见的需求。无论是系统监控告警、用户注册验证、还是定时报告发送,Python都提供了强大的库来实现邮件服务的调用。本文将详细介绍如何使用Python调用邮件服务,包括依赖库、调用方法、代码示例以及可能出现的错误和解决方案。

一、依赖的库

Python标准库中已经包含了用于发送邮件的模块,主要有以下几个:

1. smtplib

smtplib是Python标准库中用于发送邮件的核心模块,它实现了SMTP(Simple Mail Transfer Protocol)客户端协议,可以连接到SMTP服务器并发送邮件。

2. email

email模块用于构建和解析邮件消息,包括邮件头、邮件正文、附件等。它提供了一系列类来创建结构化的邮件内容。

3. ssl

ssl模块用于创建安全的SSL/TLS连接,在发送加密邮件时使用。

二、调用方法

1. 基本邮件发送

以下是使用Python发送基本文本邮件的步骤:

步骤1:导入所需模块

1
2
3
import smtplib
from email.mime.text import MIMEText
from email.header import Header

步骤2:配置邮件服务器信息

1
2
3
4
5
# 邮件服务器配置
smtp_server = 'smtp.qq.com' # QQ邮箱SMTP服务器
smtp_port = 465 # SSL端口
username = 'your_email@qq.com' # 发件人邮箱
password = 'your_password' # 邮箱密码或授权码

步骤3:创建邮件内容

1
2
3
4
5
6
7
8
9
# 邮件内容
subject = 'Python邮件测试'
body = '这是一封通过Python发送的测试邮件!'

# 创建MIMEText对象
msg = MIMEText(body, 'plain', 'utf-8')
msg['From'] = Header('发件人名称', 'utf-8')
msg['To'] = Header('收件人名称', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')

步骤4:发送邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
try:
# 创建SSL连接
server = smtplib.SMTP_SSL(smtp_server, smtp_port)
# 登录邮件服务器
server.login(username, password)
# 发送邮件
server.sendmail(username, ['recipient@example.com'], msg.as_string())
print('邮件发送成功!')
except Exception as e:
print(f'邮件发送失败:{e}')
finally:
# 关闭连接
server.quit()

2. 发送HTML格式邮件

如果需要发送HTML格式的邮件,可以将MIMEText的subtype参数设置为’html’:

1
2
3
4
5
6
7
8
9
10
11
12
13
# HTML邮件内容
html_body = """
<html>
<body>
<h1>Python HTML邮件测试</h1>
<p>这是一封<strong>HTML格式</strong>的测试邮件!</p>
<a href="https://www.python.org">访问Python官网</a>
</body>
</html>
"""

# 创建HTML邮件
msg = MIMEText(html_body, 'html', 'utf-8')

3. 发送带附件的邮件

发送带附件的邮件需要使用email.mime.multipart.MIMEMultipart类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header

# 创建MIMEMultipart对象
msg = MIMEMultipart()
msg['From'] = Header('发件人名称', 'utf-8')
msg['To'] = Header('收件人名称', 'utf-8')
msg['Subject'] = Header('带附件的Python邮件测试', 'utf-8')

# 添加正文
body = '这是一封带附件的测试邮件!'
msg.attach(MIMEText(body, 'plain', 'utf-8'))

# 添加附件
file_path = 'example.txt'
with open(file_path, 'rb') as f:
attachment = MIMEApplication(f.read(), _subtype='txt')
attachment.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', '示例文件.txt'))
msg.attach(attachment)

# 发送邮件(代码同上)

三、常见错误及解决方案

1. 认证失败错误

错误信息smtplib.SMTPAuthenticationError: (535, b'Login Fail. Please enter your authorization code to login.')

解决方案

  • 确保用户名和密码正确
  • 对于QQ、163等邮箱,需要使用授权码而非登录密码
  • 检查邮箱是否开启了SMTP服务

2. 连接错误

错误信息smtplib.SMTPServerDisconnected: Connection unexpectedly closed

解决方案

  • 检查SMTP服务器地址和端口是否正确
  • 确保网络连接正常
  • 尝试使用不同的端口(如465、587)

3. SSL错误

错误信息ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

解决方案

  • 确保SSL证书有效
  • 可以临时禁用证书验证(不推荐用于生产环境):
    1
    2
    3
    4
    5
    import ssl
    context = ssl.create_default_context()
    context.check_hostname = False
    context.verify_mode = ssl.CERT_NONE
    server = smtplib.SMTP_SSL(smtp_server, smtp_port, context=context)

4. 邮件被标记为垃圾邮件

解决方案

  • 确保邮件内容规范,避免使用垃圾邮件关键词
  • 添加正确的发件人信息和回复地址
  • 配置SPF、DKIM等邮件验证机制
  • 避免频繁发送大量邮件

5. 字符编码错误

错误信息UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

解决方案

  • 确保所有字符串都使用正确的编码(如UTF-8)
  • 使用email.header.Header类处理中文标题和发件人信息

四、进阶用法

1. 使用第三方库

除了标准库外,还有一些第三方库可以简化邮件发送,如yagmail

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import yagmail

# 配置邮件服务器
yag = yagmail.SMTP(user='your_email@qq.com', password='your_password', host='smtp.qq.com')

# 发送邮件
yag.send(
to='recipient@example.com',
subject='yagmail测试',
contents='这是使用yagmail发送的测试邮件!',
attachments='example.txt'
)

# 关闭连接
yag.close()

2. 发送带图片的HTML邮件

在HTML邮件中嵌入图片需要使用email.mime.image.MIMEImage类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from email.mime.image import MIMEImage

# 添加图片到邮件
with open('image.jpg', 'rb') as f:
img = MIMEImage(f.read())
img.add_header('Content-ID', '<image1>')
msg.attach(img)

# 在HTML中引用图片
html_body = f"""
<html>
<body>
<h1>带图片的HTML邮件</h1>
<p>这是一张图片:</p>
<img src="cid:image1" alt="测试图片">
</body>
</html>
"""

3. 批量发送邮件

对于需要批量发送邮件的场景,可以使用循环遍历收件人列表:

1
2
3
4
5
6
7
8
9
10
# 收件人列表
recipients = ['user1@example.com', 'user2@example.com', 'user3@example.com']

# 批量发送
for recipient in recipients:
try:
server.sendmail(username, [recipient], msg.as_string())
print(f'向 {recipient} 发送邮件成功!')
except Exception as e:
print(f'向 {recipient} 发送邮件失败:{e}')

五、总结

通过Python调用邮件服务是一项实用的技能,可以帮助我们实现各种自动化邮件发送需求。本文介绍了使用Python标准库smtplibemail发送邮件的方法,包括基本文本邮件、HTML邮件和带附件的邮件,并详细说明了常见错误及解决方案。

在实际应用中,需要根据具体需求选择合适的发送方式,并注意邮件服务器的配置和安全设置。同时,为了提高邮件的送达率,还需要注意邮件内容的规范和反垃圾邮件策略。

希望本文能够帮助你掌握Python调用邮件服务的技能,为你的项目开发提供便利!

六、参考资料

  1. Python官方文档 - smtplib
  2. Python官方文档 - email
  3. QQ邮箱SMTP服务设置
  4. 163邮箱SMTP服务设置

FastAPI基础应用

1. FastAPI简介

FastAPI是一个现代化、高性能的Web框架,用于构建API,基于Python 3.6+的类型提示和异步支持。它具有以下特点:

  • 快速:基于Starlette和Pydantic,性能可与NodeJS和Go媲美
  • 自动API文档:自动生成交互式API文档(Swagger UI和ReDoc)
  • 类型安全:利用Python类型提示进行数据验证和自动生成文档
  • 异步支持:原生支持异步操作,提高并发处理能力
  • 简单易用:API设计简洁,学习曲线平缓
  • 社区活跃:持续更新和完善,拥有丰富的生态系统

2. 环境搭建与依赖安装

2.1 安装Python

FastAPI需要Python 3.6+,建议使用Python 3.8或更高版本。可以从Python官网下载并安装。

2.2 安装FastAPI和依赖

使用pip安装FastAPI及其依赖:

1
pip install fastapi uvicorn
  • fastapi:FastAPI框架本身
  • uvicorn:ASGI服务器,用于运行FastAPI应用

3. 第一个FastAPI应用

3.1 创建基础应用

创建一个名为main.py的文件,编写以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from fastapi import FastAPI

# 创建FastAPI实例
app = FastAPI()

# 定义根路径路由
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}

# 定义带路径参数的路由
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}

3.2 运行应用

在终端中执行以下命令运行应用:

1
uvicorn main:app --reload
  • main:Python文件名(不含.py扩展名)
  • app:FastAPI实例名称
  • --reload:启用自动重载,代码修改后自动重启服务器

运行成功后,在浏览器中访问:

4. 路由与HTTP方法

FastAPI支持所有常见的HTTP方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from fastapi import FastAPI

app = FastAPI()

# GET请求
@app.get("/items")
def get_items():
return {"method": "GET", "action": "获取所有物品"}

# POST请求
@app.post("/items")
def create_item():
return {"method": "POST", "action": "创建物品"}

# PUT请求
@app.put("/items/{item_id}")
def update_item(item_id: int):
return {"method": "PUT", "action": "更新物品", "item_id": item_id}

# DELETE请求
@app.delete("/items/{item_id}")
def delete_item(item_id: int):
return {"method": "DELETE", "action": "删除物品", "item_id": item_id}

5. 请求处理

5.1 路径参数

路径参数是URL路径的一部分,用于标识特定资源:

1
2
3
4
5
6
7
@app.get("/users/{user_id}/items/{item_id}")
def get_user_item(user_id: int, item_id: int, q: str = None):
return {
"user_id": user_id,
"item_id": item_id,
"q": q
}

5.2 查询参数

查询参数是URL中?后面的键值对,用于过滤、排序等操作:

1
2
3
4
@app.get("/items/")
def get_items(skip: int = 0, limit: int = 10):
# skip和limit是查询参数,有默认值
return {"skip": skip, "limit": limit}

5.3 请求体

使用Pydantic模型定义请求体:

1
2
3
4
5
6
7
8
9
10
11
12
from pydantic import BaseModel

# 定义Pydantic模型
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None

@app.post("/items/")
def create_item(item: Item):
return item

5.4 表单数据

安装依赖:

1
pip install python-multipart

使用Form类处理表单数据:

1
2
3
4
5
from fastapi import Form

@app.post("/login/")
def login(username: str = Form(...), password: str = Form(...)):
return {"username": username, "password": "******"}

5.5 文件上传

使用UploadFile类处理文件上传:

1
2
3
4
5
6
7
8
from fastapi import UploadFile, File

@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
return {
"filename": file.filename,
"content_type": file.content_type
}

6. 响应处理

6.1 返回JSON响应

FastAPI默认将Python字典转换为JSON响应:

1
2
3
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id, "name": "Item Name"}

6.2 自定义响应状态码

使用status参数指定响应状态码:

1
2
3
4
5
from fastapi import status

@app.post("/items/", status_code=status.HTTP_201_CREATED)
def create_item(item: Item):
return item

6.3 自定义响应头

使用Response类自定义响应头:

1
2
3
4
5
6
from fastapi import Response

@app.get("/items/{item_id}")
def read_item(item_id: int, response: Response):
response.headers["X-Item-ID"] = str(item_id)
return {"item_id": item_id}

6.4 直接返回响应

使用JSONResponseHTMLResponse等直接返回响应:

1
2
3
4
5
6
7
8
9
from fastapi.responses import JSONResponse, HTMLResponse

@app.get("/json/")
def get_json():
return JSONResponse(content={"message": "Hello"}, status_code=200)

@app.get("/html/")
def get_html():
return HTMLResponse(content="<h1>Hello, FastAPI!</h1>")

7. Pydantic模型

Pydantic是FastAPI的核心依赖之一,用于数据验证和设置管理。

7.1 基础模型定义

1
2
3
4
5
6
7
8
9
from pydantic import BaseModel, Field

class User(BaseModel):
username: str
email: str
full_name: str = None
disabled: bool = False
# 使用Field添加额外验证和描述
age: int = Field(..., ge=0, le=120, description="用户年龄")

7.2 嵌套模型

1
2
3
4
5
6
class Address(BaseModel):
city: str
country: str

class UserWithAddress(User):
address: Address

7.3 模型继承

1
2
3
4
5
6
7
8
9
10
11
12
class BaseItem(BaseModel):
name: str
description: str = None

class ItemIn(BaseItem):
price: float
tax: float = None

class ItemOut(BaseItem):
id: int
price: float
tax: float = None

8. 中间件

中间件是在请求和响应之间执行的代码,可以用于日志记录、身份验证等。

8.1 创建自定义中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# 添加CORS中间件
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 允许所有来源,生产环境应指定具体域名
allow_credentials=True,
allow_methods=["*"], # 允许所有HTTP方法
allow_headers=["*"], # 允许所有请求头
)

# 自定义中间件
@app.middleware("http")
async def add_process_time_header(request, call_next):
import time
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response

9. 异常处理

9.1 抛出HTTP异常

1
2
3
4
5
6
7
8
9
10
11
from fastapi import HTTPException

@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id not in items:
raise HTTPException(
status_code=404,
detail="Item not found",
headers={"X-Error": "Item not found"}
)
return {"item_id": item_id}

9.2 自定义异常处理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from fastapi import Request
from fastapi.responses import JSONResponse

# 自定义异常类
class CustomException(Exception):
def __init__(self, name: str):
self.name = name

# 注册异常处理器
@app.exception_handler(CustomException)
async def custom_exception_handler(request: Request, exc: CustomException):
return JSONResponse(
status_code=418,
content={"message": f"I am a teapot, {exc.name}"}
)

@app.get("/teapot")
def get_teapot():
raise CustomException(name="FastAPI")

10. API文档

FastAPI自动生成两种API文档:

10.1 Swagger UI

访问 http://127.0.0.1:8000/docs,可以看到交互式API文档,支持直接测试API。

10.2 ReDoc

访问 http://127.0.0.1:8000/redoc,可以看到更简洁的API文档。

10.3 自定义文档

可以自定义文档的标题和描述:

1
2
3
4
5
app = FastAPI(
title="My FastAPI Application",
description="This is a simple FastAPI application",
version="0.1.0",
)

11. 部署FastAPI应用

11.1 使用Uvicorn部署

生产环境部署命令:

1
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
  • --workers:指定工作进程数,建议为CPU核心数

11.2 使用Gunicorn + Uvicorn

安装依赖:

1
pip install gunicorn

运行命令:

1
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

11.3 容器化部署

创建Dockerfile

1
2
3
4
5
6
7
8
9
10
FROM python:3.9

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

创建requirements.txt

1
2
fastapi
uvicorn

构建和运行Docker容器:

1
2
docker build -t fastapi-app .
docker run -d -p 8000:8000 fastapi-app

12. 常见问题与解决方案

12.1 跨域问题

使用CORS中间件解决:

1
2
3
4
5
6
7
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

12.2 类型错误

确保所有函数参数都有正确的类型提示,Pydantic模型字段也有正确的类型。

12.3 依赖注入错误

确保依赖项的返回类型与预期一致,使用Depends类正确注入依赖。

13. 进阶主题

13.1 依赖注入

使用Depends类实现依赖注入:

1
2
3
4
5
6
7
8
9
10
11
12
from fastapi import Depends

def get_db():
db = "Database Connection"
try:
yield db
finally:
db = "Closed"

@app.get("/items/")
def get_items(db: str = Depends(get_db)):
return {"db": db}

13.2 安全认证

使用OAuth2PasswordBearer实现OAuth2认证:

1
2
3
4
5
6
7
8
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

@app.get("/users/me")
def read_users_me(token: str = Depends(oauth2_scheme)):
return {"token": token}

13.3 测试FastAPI应用

使用TestClient测试FastAPI应用:

1
2
3
4
5
6
7
8
9
from fastapi.testclient import TestClient
from main import app

client = TestClient(app)

def test_read_main():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello, FastAPI!"}

14. 总结

FastAPI是一个现代化、高性能的Web框架,具有以下优势:

  • 快速的开发速度
  • 自动生成API文档
  • 类型安全
  • 异步支持
  • 简单易用
  • 丰富的生态系统

通过本文的介绍,你已经了解了FastAPI的基础应用,包括:

  • 环境搭建与依赖安装
  • 第一个FastAPI应用
  • 路由与HTTP方法
  • 请求处理(路径参数、查询参数、请求体、表单数据、文件上传)
  • 响应处理
  • Pydantic模型
  • 中间件
  • 异常处理
  • API文档
  • 部署方式
  • 常见问题与解决方案

FastAPI是构建现代API的理想选择,无论是小型项目还是大型应用,都能提供高效、可靠的支持。

15. 参考资料

从高一开始,拥抱滚烫的青春与梦想

初入高中:认识新挑战

刚踏入高中校园,一切都是崭新的,新的同学、老师,还有那充满未知的学习旅程。高中的学习和初中相比,简直是上了一个大台阶。知识不再是简单的基础内容,而是更加深入和复杂。就拿数学来说,初中可能只是学习一些基本的代数和几何知识,到了高中,函数、数列、圆锥曲线等抽象又复杂的知识扑面而来,难度直线上升。

从学习能力要求来看,初中时,我们可能更多地依赖老师的督促和指导,老师会把知识点掰开了揉碎了喂给我们。但高中不同,它更强调自主学习和独立思考。老师讲课的速度变快了,不可能再像初中那样反复讲解一个知识点,这就需要我们自己主动去探索、去总结归纳 ,遇到问题先自己思考,尝试寻找解决办法。

学习节奏也快得让人有点应接不暇。初中一节课可能只讲一个知识点,还有足够的时间消化练习。高中一节课往往要涵盖两三个甚至更多的知识点,信息量巨大。如果我们还像初中那样慢悠悠地学习,不及时调整学习方法,很容易就跟不上节奏,被甩在后面。 面对这么多的变化和挑战,制定一个科学合理的高中三年学习计划就显得尤为重要,它能帮我们有条不紊地开启高中学习,在这三年里收获满满,实现自己的目标。

高一:筑牢根基,开启征程

适应与探索

刚上高一,适应老师的教学方法是头等大事。高中老师的教学风格各不相同,有的老师讲课速度快,知识点讲解简洁明了;有的老师则注重拓展,会引入很多课外的知识和案例。我们不能因为不适应某个老师的教学风格就自暴自弃,而是要主动去适应。比如,对于讲课速度快的老师,我们可以在课前预习相关知识,标记出自己的疑问点,这样在课堂上就能更好地跟上老师的节奏;对于喜欢拓展的老师,我们要准备好笔记本,及时记录下老师补充的内容,课后再去深入了解 。

高中知识和初中相比,深度和广度都有了很大的提升。就拿物理来说,初中物理主要研究一些简单的物理现象,像物体的运动、简单的机械等,公式也比较直观,容易理解和运用。高中物理则深入到了电场、磁场、相对论等更抽象的领域,公式的推导和运用也更加复杂,需要我们具备更强的逻辑思维能力。所以,我们要尽快认识到高中知识的这些特点,改变自己的学习思维。

探索适合自己的学习方法也很关键。有的人是视觉型学习者,通过看图表、做笔记能更好地掌握知识;有的人是听觉型学习者,听老师讲解、听录音效果更好;还有的人是动觉型学习者,通过动手操作、做实验能加深对知识的理解。我们可以在学习过程中多尝试不同的方法,看看哪种最适合自己。比如,学习历史时,视觉型学习者可以制作思维导图,把历史事件和人物关系直观地展现出来;听觉型学习者可以听历史故事的音频,在轻松的氛围中学习;动觉型学习者可以尝试制作历史年代尺,通过动手操作加深对历史事件先后顺序的记忆。

时间管理与课程学习

在时间管理方面,三维日程规划法就像一个得力助手,能帮我们把时间安排得井井有条。首先是拆解目标和可视化执行,我们可以用 A4 纸绘制每月学科任务轴,把每个学科的重要任务、学习进度都标注清楚。像数学,我们可以标注出月考重点章节、每周计划刷题量以及每天要做的 3 道压轴题 ;物理可以用不同颜色笔区分新课学习和实验复习,这样把任务贴在书桌前,就能时刻提醒自己,让学习任务一目了然。

碎片时间也不能浪费,课间 10 分钟可以用 “三明治填充法” 高效利用起来。前 3 分钟回顾上节课笔记,把老师讲的重点内容快速过一遍,强化记忆;中间 5 分钟预习下节课例题,提前了解上课要讲的内容,找出自己的疑惑点,这样上课听讲更有针对性;最后 2 分钟远眺放松,缓解眼睛疲劳,为下节课养精蓄锐。午休前 15 分钟可以用手机背 1 组英语高频词,像用 “不背单词” APP 的 “随身听” 模式,在不知不觉中积累词汇量。周末则采用 “能量区块” 分配法,把周六上午定为 “高强度学科攻坚段”,集中精力攻克数学套卷和物理实验题等难题;下午安排 “兴趣充电时间”,学习自己感兴趣的编程网课,或者去参加篮球训练,放松身心;周日晚上花 1 小时做下周计划复盘,用荧光笔标记出 “未完成任务” 的原因,比如 “数学大题耗时超预期,下周提前预留 30 分钟” ,以便及时调整学习计划。

针对各科的学习,也有不同的策略。语文要注重日常积累,每天背诵古诗词、名言警句,增加文学素养;每周练习两篇阅读理解,总结答题技巧;周末仿写一篇满分作文,学习优秀的作文框架和写作思路。数学要吃透课本,把重要的概念、公式、法则、定理的形成过程理解透彻,整理错题,分析错因,做到举一反三 。英语要每天背诵单词,坚持听力练习,积累万能句型,提升写作水平。物理要弄懂每个公式、定律的来龙去脉,建立错题本,养成良好的审题习惯。化学按单元整理知识框架和思维导图,方便复习记忆 。生物不仅要多背诵书上的知识,还要把知识点按照本身的逻辑串起来,抓取主要知识点,重点突破。

自我提升与兴趣培养

高中不仅仅是学习知识的阶段,也是培养综合素质的重要时期。参加学校的社团活动、志愿者活动,能锻炼我们的沟通能力、团队协作能力和领导能力。比如参加辩论社,在激烈的辩论中,我们的思维会变得更加敏捷,表达能力也会得到很大提升;参与志愿者活动,能让我们学会关爱他人,增强社会责任感。

发展兴趣爱好也很重要,它能让我们在紧张的学习之余放松身心,还可能为未来的职业发展打下基础。如果你对绘画感兴趣,可以利用课余时间学习绘画技巧,参加绘画比赛;对音乐感兴趣,就加入学校的乐队,学习一门乐器,享受音乐带来的快乐 。

阅读课外书籍也是自我提升的好方法,它能拓宽我们的知识面,开阔视野。文学名著能让我们领略不同时代、不同地域的文化魅力,提升文学鉴赏能力;科普读物能让我们了解科学前沿知识,激发对科学的兴趣;哲学书籍能启发我们思考人生的意义和价值,培养批判性思维。每个月至少读一本课外书籍,并做好读书笔记,记录下自己的感悟和思考,这对我们的成长会有很大的帮助。

高二:突破自我,稳步提升

深化知识与拓展视野

高二是高中学习的关键时期,知识的深化和拓展至关重要。在这个阶段,我们要对各科知识进行更深入的学习,建立起完整的知识体系。以数学为例,我们不能仅仅满足于掌握课本上的公式和定理,还要通过做一些有难度的练习题,加深对知识点的理解和运用。比如圆锥曲线部分,它涉及到很多复杂的计算和几何性质,我们可以通过多做一些综合性的题目,将椭圆、双曲线、抛物线的知识串联起来,形成一个知识网络,这样在解题时就能更加得心应手。

除了课本知识,拓展学习也很重要。我们可以参加学科竞赛,像数学竞赛、物理竞赛等,这些竞赛不仅能锻炼我们的思维能力,还能让我们接触到更前沿的知识,拓宽视野。即使没有获得奖项,在准备竞赛的过程中,我们也能学到很多课本上学不到的方法和技巧,对我们的日常学习有很大的帮助。还可以阅读一些相关的学术论文,了解学科的最新研究成果和发展趋势,这有助于我们培养对学科的兴趣,激发学习的动力 。

选科与职业规划

高二面临着选科的重要决策,这关系到我们未来的高考和职业发展。选科时,我们要综合考虑自己的兴趣爱好、学科优势和未来的职业规划。如果你对生物和化学感兴趣,且成绩也不错,将来又想从事医学相关的职业,那么选择生物和化学作为选考科目就是一个不错的选择。我们可以通过一些职业测评工具,如霍兰德职业兴趣测试、MBTI 性格测试等,了解自己的职业倾向和性格特点,为选科提供参考 。

选科确定后,我们要初步探索职业方向,树立目标。可以利用假期参加一些职业体验活动,比如去医院体验医生的工作、去企业了解工程师的日常,亲身感受不同职业的工作内容和氛围,这样能让我们更加明确自己的职业目标。我们还可以关注一些大学专业的招生要求和就业前景,提前了解自己感兴趣的专业需要具备哪些知识和技能,为高中的学习做好准备。

心态调整与压力管理

高二的学习压力逐渐增大,课程难度增加,考试也更加频繁,这时候保持良好的心态就显得尤为重要。当我们感到压力大的时候,可以运用一些情绪调节技巧,比如深呼吸,找一个安静的地方,慢慢地吸气,再缓缓地呼气,重复几次,能让我们的身心得到放松;也可以通过听音乐来缓解压力,听一些舒缓的音乐,让自己沉浸在音乐的世界里,忘却学习的烦恼。

建立支持网络也能帮助我们应对压力,当我们遇到困难和挫折时,不要一个人独自承受,可以和父母、老师、朋友倾诉,他们能从不同的角度给我们提供建议和支持。和同学互相鼓励、互相学习,一起讨论问题,共同进步,也能让我们在学习中感受到温暖和力量,减轻压力 。

高三:全力冲刺,圆梦高考

三轮复习策略

高三是高中学习的最后冲刺阶段,三轮复习策略至关重要。一轮复习从 9 月到次年 2 月,这是打牢基础的关键时期,要对高中三年的知识进行全面梳理,不能遗漏任何一个知识点,做到地毯式复习。比如数学,要把函数、数列、圆锥曲线等各个板块的基本概念、定理、公式都重新复习一遍,通过做基础练习题,加深对知识点的理解和记忆,建立起完整的知识体系。

二轮复习在 3 月和 4 月,这个阶段要进行专题复习,将知识点串联起来,提高综合运用知识的能力。以物理为例,会分力学、电学、热学等专题进行复习,通过做一些综合性的题目,掌握不同知识点之间的联系和应用技巧,攻克重点难点 。

三轮复习从 5 月开始,主要是进行模拟考试和真题演练,培养考试状态,提高答题速度和准确率。按照高考的考试时间和要求,定时定量地做模拟试卷和历年真题,让自己适应高考的节奏。比如每周安排三次模拟考试,分别模拟语文、数学、英语的考试时间,考试结束后认真分析试卷,总结答题技巧和经验 。

真题模拟与错题整理

在高三复习中,真题模拟和错题整理是提高成绩的重要方法。真题是最宝贵的复习资料,它能让我们了解高考的命题规律和题型特点。我们要认真研究近五年的高考真题,分析每道题的考点、解题思路和答题技巧。比如英语真题中的阅读理解,我们可以总结出不同类型文章的阅读方法和答题技巧,像细节理解题要在文中找到对应的信息,推理判断题要根据文章内容进行合理推断等 。

错题是我们知识薄弱点的体现,整理错题能帮助我们有针对性地进行复习。建立错题本,把平时练习和考试中的错题分类整理,分析错误原因,比如是知识点掌握不牢,还是解题思路错误,或者是粗心大意导致的。对于因为知识点掌握不牢而做错的题目,要重新复习相关知识点,加强记忆;对于解题思路错误的题目,要学习正确的解题方法,总结经验教训 。定期回顾错题本,不断巩固薄弱环节,避免在同一个问题上再次出错。

保持状态与调整心态

高三后期,保持良好的学习和生活状态,调整好心态,对于高考的发挥至关重要。在学习方面,要合理安排时间,避免过度劳累。每天保证 7 - 8 小时的睡眠时间,中午适当午休,让大脑得到充分的休息。学习时间也要合理分配,不要长时间学习同一科目,以免产生疲劳和厌烦情绪。可以采用番茄工作法,学习 25 分钟,休息 5 分钟,这样既能提高学习效率,又能保持良好的学习状态 。

在生活方面,要坚持适量的运动,像每天早上起床后进行 15 分钟的晨跑,或者晚上学习结束后做一些简单的伸展运动,能增强体质,缓解压力。饮食上要注意营养均衡,多吃富含蛋白质、维生素的食物,少吃油腻、辛辣的食物,为学习提供充足的能量 。

心态调整也不容忽视,高考的压力可能会让我们产生焦虑、紧张等情绪。当感到焦虑时,我们可以通过听音乐、看电影、和朋友聊天等方式放松自己,缓解压力。要相信自己的努力和付出,给自己积极的心理暗示,告诉自己 “我可以的”“我已经做好了充分的准备”,保持自信的心态,从容应对高考 。

写在最后:奔赴未来

高中三年,是一场充满挑战与机遇的马拉松,而一份精心规划的学习计划,就是我们这场征程中的指南针,它能引领我们穿越知识的海洋,跨越成长的障碍,最终抵达成功的彼岸。它不仅能帮助我们合理安排时间,高效利用每一分每一秒,还能让我们在面对困难和挫折时,保持清晰的思路和坚定的信念,不迷茫、不退缩。

对于即将开启高中生活的高一新生们,希望你们能认真对待这份学习计划,将它作为自己高中三年学习的行动指南。在实施计划的过程中,或许会遇到各种困难和挫折,比如学习成绩不理想、计划执行不顺利等,但请不要灰心丧气,要相信每一次的挫折都是成长的机遇,每一次的失败都是成功的铺垫。只要我们坚持不懈地努力,不断调整和完善计划,就一定能实现自己的目标。

“宝剑锋从磨砺出,梅花香自苦寒来。” 高中三年的学习生活或许会充满艰辛,但只要我们怀揣梦想,勇往直前,用汗水和努力浇灌希望的种子,就一定能在三年后的夏天,收获属于自己的累累硕果,向着心中的梦想大步迈进,开启人生新的篇章!

写代码的好帮手

前言

 到今天,作者已经学习编程四年有余,那么我认为写代码的最好帮手是什么?

 这就是我今天所要讲的内容。

Top1

Pycharm

 不得不说,对于想要学习python的新手来说,pycharm是一个不错的工具,它作为JetBrains的优秀产品,集成了代码补全、mysql数据库等实用功能,可以说是非常强大,并且专业版还有一个月的免费试用

Top2

VSCode

 VsCode具有丰富的插件,在原有的功能下可以有更多的拓展,创造出了更多可能,并且其支持多种的语言编写,适合需要多个语言频繁切换的人使用。

Top 3

IDEA

 IntelliJ IDEA 使用工具帮助您更快地编写代码,这些工具可以消除繁琐的任务,让您专注于重要的事情 - 构建出色的软件。

 获取编写高质量代码、最大限度地减少错误和减少技术债务所需的一切,以便您可以将更多时间花在创新而不是故障排除上。

 它专为极致舒适而设计,提供流畅、愉快的工作流程,帮助您保持流畅。

hexo报错解决方案

1. ERROR Deployer not found: git

出现于 hexo clean && hexo g -d

原因分析

在初次部署hexo时没有安装hexo-deployer-git插件导致的

解决方案

cmd npm install hexo-deployer-git --save

2.INFO Validating config

出现于hexo d

原因分析

与远程部署hexo发现远程仓库未更新

解决方案

在使用hexo d前,先执行下列命令

npm un hexo-deployer-git
npm i hexojs/hexo-deployer-git

这样会导致原本的hexo-deployer-git插件会出现问题, 需要重新安装一遍才能解决问题。

来源:https://blog.csdn.net/YunxBao/article/details/139754089

正在更新中…