Python Requests库详解

news2025/2/23 3:38:30

        大家好,在现代网络开发中,与Web服务器进行通信是一项至关重要的任务。Python作为一种多才多艺的编程语言,提供了各种工具和库来简化这一过程。其中,Requests库作为Python中最受欢迎的HTTP库之一,为开发人员提供了简单而强大的方式来发送HTTP请求和处理响应。

        从最基本的GET请求到复杂的身份验证和代理设置,Requests库为我们提供了丰富的功能和灵活的接口。无论是爬虫、Web开发还是测试,Requests都是一个不可或缺的工具。

        本文将带领您深入探索Python Requests库的世界。我们将从基础知识开始,逐步深入,覆盖各种高级用法和技巧。无论您是初学者还是有经验的开发者,本文都将为您提供有价值的信息和实用的技巧,帮助您更好地利用Python Requests库构建强大的网络应用。

一、介绍

        在现代网络通信中,发送HTTP请求和处理响应是编程中常见的任务之一。而Python中的Requests库为开发人员提供了一种简单、优雅且功能丰富的方法来处理这些任务。

Requests是什么?

        Requests是一个优雅且简洁的HTTP库,专门设计用于发送各种类型的HTTP请求。它由Kenneth Reitz于2010年创建,并迅速成为Python社区中最受欢迎的HTTP客户端库之一。Requests库构建在Python的标准库urllib之上,提供了更简洁、更人性化的接口。

Requests库的作用

        Requests库的主要作用是简化HTTP请求的发送和响应的处理。通过Requests,开发人员可以轻松地执行GET、POST、PUT、DELETE等各种类型的HTTP请求,并处理服务器返回的响应数据。不仅如此,Requests还提供了许多方便的功能,比如自动处理重定向、会话管理、身份验证、代理设置等,使得网络通信变得更加简单和灵活。

为什么Requests库如此流行?

Requests库之所以如此流行,是因为它具有以下几个显著的优点:

  1. 简单易用:Requests提供了简洁而直观的API,使得发送HTTP请求变得非常容易。开发人员无需处理复杂的细节,只需几行代码就可以完成常见的网络通信任务。

  2. 功能丰富:尽管Requests提供了简单的接口,但它同时也提供了许多强大的功能和高级选项,满足了各种复杂场景下的需求。无论是处理会话、处理重定向、进行身份验证还是设置代理,Requests都能轻松胜任。

  3. 文档齐全:Requests拥有清晰、详细的官方文档,涵盖了库的各个方面,包括基本用法、高级功能、示例代码等。这使得开发人员可以轻松查阅文档,解决各种问题。

  4. 活跃的社区支持:Requests库拥有一个庞大且活跃的社区,开发人员可以在社区中获得及时的帮助和支持。无论是提出问题、报告Bug还是贡献代码,社区都是一个宝贵的资源。

        Requests库因其简单易用、功能丰富且受到活跃的社区支持而在Python开发中广受欢迎。它成为了许多开发人员处理HTTP请求的首选工具,为他们节省了大量的时间和精力。

二、安装

        安装Requests库是开始使用它的第一步。在这一部分,我们将详细说明如何安装Requests库,并提供一些可能遇到的安装问题及其解决方案。

1. 使用pip安装

        大多数情况下,使用Python的包管理工具pip来安装Requests库是最简单的方法。如果你使用的是Python 3,通常pip已经随着Python的安装而包含在内。以下是安装Requests库的命令:

pip install requests

2. 使用conda安装

如果你使用的是Anaconda Python发行版,你也可以使用conda来安装Requests库:

conda install requests

3. 可能的安装问题及解决方案

        尽管安装Requests库通常是一件简单的事情,但有时你可能会遇到一些问题。以下是一些可能的安装问题及其解决方案:

问题1:SSL证书验证失败

        有时在安装Requests库时可能会出现SSL证书验证失败的问题,这可能是因为缺少适当的SSL证书或网络环境的问题。

解决方案:你可以尝试在安装时禁用SSL证书验证。在pip安装时,你可以使用--trusted-host参数,如下所示:

pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org requests

问题2:安装过程慢或失败

有时由于网络问题或服务器问题,安装过程可能会变得缓慢或失败。

解决方案:你可以尝试更换pip的镜像源来加速安装过程,或者尝试多次运行安装命令以解决服务器问题。

问题3:权限问题

在某些操作系统中,可能会由于权限问题而导致安装失败。

解决方案:你可以尝试使用管理员权限或者使用虚拟环境来避免权限问题。

问题4:依赖冲突

有时安装Requests库可能会与其他依赖冲突。

解决方案:你可以尝试升级或降级pip、Python或其他相关的依赖包,以解决依赖冲突。

三、发送基本的 GET 和 POST 请求

        在网络通信中,最常见的两种HTTP请求是GET请求和POST请求。GET请求用于从服务器获取资源,而POST请求用于向服务器提交数据。在这一部分,我们将演示如何使用Requests库发送最基本的GET和POST请求,并解释它们之间的区别。

1. 发送GET请求

        使用Requests库发送GET请求非常简单。你只需要使用requests.get()函数,并传入目标URL即可。下面是一个简单的示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 打印响应内容
print(response.text)

上面的代码发送了一个GET请求到https://api.example.com/data,并打印了服务器响应的内容。

2. 发送POST请求

与GET请求类似,发送POST请求也非常简单。你只需要使用requests.post()函数,并传入目标URL和要提交的数据即可。下面是一个简单的示例:

import requests

# 要提交的数据
data = {'username': 'user', 'password': '123456'}

# 发送POST请求
response = requests.post('https://api.example.com/login', data=data)

# 打印响应内容
print(response.text)

        上面的代码发送了一个POST请求到https://api.example.com/login,并提交了用户名和密码数据。服务器接收到数据后,会进行处理,并返回相应的响应。

3. GET请求和POST请求的区别

GET请求和POST请求的主要区别在于数据的传输方式和安全性:

  • GET请求:通过URL参数传递数据,数据以明文形式出现在URL中,因此不适合传输敏感信息。GET请求通常用于获取资源,比如网页、图片等。

  • POST请求:通过请求体传递数据,数据以密文形式传输,因此更安全,适合传输敏感信息。POST请求通常用于向服务器提交数据,比如用户登录、提交表单等。

        总的来说,GET请求适合用于获取资源,而POST请求适合用于提交数据。在实际开发中,你需要根据具体的需求选择合适的请求方式。

四、请求头和请求体

        在发送HTTP请求时,除了URL以外,还可以设置请求头和请求体。请求头用于传递一些额外的信息给服务器,比如用户代理、授权信息等。请求体则用于向服务器提交数据,比如表单数据、JSON数据等。在这一部分,我们将详细说明如何设置请求头和请求体,并解释它们的作用。

1. 设置请求头

        使用Requests库设置请求头非常简单,你只需要传递一个字典给headers参数即可。下面是一个示例:

import requests

# 设置请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Authorization': 'Bearer your_access_token'
}

# 发送带有自定义请求头的GET请求
response = requests.get('https://api.example.com/data', headers=headers)

# 打印响应内容
print(response.text)

上面的代码设置了两个常见的请求头:User-Agent用于指定用户代理,Authorization用于进行身份验证。你可以根据需要设置其他请求头。

2. 设置请求体

发送POST请求时,你可以通过data参数设置请求体,传递要提交的数据。如果要发送JSON数据,可以使用json参数。下面是一个示例:

import requests

# 要提交的数据
data = {
    'username': 'user',
    'password': '123456'
}

# 发送带有请求体的POST请求
response = requests.post('https://api.example.com/login', data=data)

# 打印响应内容
print(response.text)

上面的代码设置了一个请求体,包含了用户名和密码数据。服务器收到数据后,会进行处理,并返回相应的响应。

3. 请求头和请求体的作用

  • 请求头:请求头包含了一些附加的信息,用于告诉服务器关于请求的一些额外信息,比如客户端类型、接受的数据类型等。它可以用于实现用户代理识别、身份验证、设置Cookie等功能。

  • 请求体:请求体用于向服务器提交数据,比如表单数据、JSON数据等。它通常用于向服务器发送需要处理的数据,比如用户登录信息、搜索关键字等。

总的来说,请求头和请求体都是HTTP请求的重要组成部分,可以通过设置它们来实现各种功能和需求。

五、处理响应

        处理HTTP响应是使用Requests库的关键部分之一。在发送HTTP请求后,服务器将返回一个响应,其中包含了状态码、响应头和响应体等信息。在这一部分,我们将讨论如何处理HTTP响应,包括获取状态码、响应头和响应体,并给出相应的示例。

1. 获取状态码

        状态码是服务器对请求的响应的一个数字编码,用于指示请求的成功或失败以及失败的原因。你可以通过status_code属性来获取响应的状态码。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 获取状态码
status_code = response.status_code

# 打印状态码
print("状态码:", status_code)

        上面的代码发送了一个GET请求,并获取了响应的状态码。你可以根据状态码来判断请求是否成功以及如何进一步处理响应。

2. 获取响应头

        响应头包含了一些关于响应的元信息,比如服务器类型、内容类型、内容长度等。你可以通过headers属性来获取响应头。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 获取响应头
headers = response.headers

# 打印响应头
print("响应头:", headers)

        上面的代码发送了一个GET请求,并获取了响应的头部信息。你可以从中获取到各种有用的信息,比如内容类型、服务器类型等。

3. 获取响应体

        响应体包含了服务器返回的实际数据内容。你可以通过text属性来获取响应体的文本内容,或者使用content属性获取二进制内容。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 获取响应体文本内容
body_text = response.text

# 获取响应体二进制内容
body_binary = response.content

# 打印响应体文本内容
print("响应体文本内容:", body_text)

# 打印响应体二进制内容
print("响应体二进制内容:", body_binary)

        上面的代码发送了一个GET请求,并获取了响应的文本内容和二进制内容。你可以根据实际需求选择使用响应体的文本内容或二进制内容。

六、处理响应内容

        在使用Requests库时,我们经常需要处理不同类型的响应内容,包括JSON、文本和二进制等。在这一部分,我们将展示如何使用Requests库处理这些不同类型的响应内容,并给出相应的示例。

1. 处理JSON响应内容

        如果服务器返回的是JSON格式的数据,我们可以使用json()方法将响应内容解析为Python字典。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 解析JSON响应内容
json_data = response.json()

# 打印解析后的数据
print("解析后的JSON数据:", json_data)

        上面的代码发送了一个GET请求,并将响应内容解析为Python字典。你可以直接使用json_data变量来访问和操作解析后的JSON数据。

2. 处理文本响应内容

        如果服务器返回的是文本格式的数据,我们可以使用text属性来获取响应内容的文本表示。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/text')

# 获取文本响应内容
text_data = response.text

# 打印文本内容
print("文本内容:", text_data)

        上面的代码发送了一个GET请求,并获取了响应内容的文本表示。你可以直接使用text_data变量来访问和操作文本内容。

3. 处理二进制响应内容

        有时服务器返回的是二进制格式的数据,比如图片、音频等。我们可以使用content属性来获取响应内容的二进制表示。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/image')

# 获取二进制响应内容
binary_data = response.content

# 将二进制内容写入文件
with open('image.jpg', 'wb') as f:
    f.write(binary_data)

        上面的代码发送了一个GET请求,并获取了响应内容的二进制表示。然后,我们将二进制内容写入到名为image.jpg的文件中,以保存图片文件。

七、高级功能

        Requests库不仅提供了基本的HTTP请求功能,还支持许多高级功能,包括会话管理、身份验证、代理设置、SSL验证等。在这一部分,我们将介绍这些高级功能,并给出相应的示例。

1. 会话管理

        会话管理允许你在多个请求之间保持会话状态。这对于模拟登录过程或者保持持久连接非常有用。你可以使用Session对象来创建一个持久的会话,并在此会话中发送多个请求。下面是一个示例:

import requests

# 创建会话对象
session = requests.Session()

# 发送第一个请求
response1 = session.get('https://api.example.com/login')

# 发送第二个请求
response2 = session.get('https://api.example.com/data')

# 关闭会话
session.close()

# 打印响应内容
print("第一个请求响应内容:", response1.text)
print("第二个请求响应内容:", response2.text)

        上面的代码创建了一个会话对象session,然后使用这个会话对象发送了两个请求。由于这两个请求共享同一个会话,因此可以保持会话状态。

2. 身份验证

        Requests库支持多种身份验证方式,包括基本身份验证、摘要身份验证、OAuth身份验证等。你可以在发送请求时,通过auth参数来指定身份验证方式。下面是一个示例:

import requests

# 基本身份验证
response = requests.get('https://api.example.com/data', auth=('username', 'password'))

# 打印响应内容
print("响应内容:", response.text)

        上面的代码使用基本身份验证方式发送了一个GET请求,其中用户名为username,密码为password

3. 代理设置

        有时候我们需要通过代理服务器来发送HTTP请求。Requests库允许你通过proxies参数来设置代理服务器。下面是一个示例:

import requests

# 设置代理服务器
proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'https://10.10.1.10:1080',
}

# 发送请求通过代理服务器
response = requests.get('https://api.example.com/data', proxies=proxies)

# 打印响应内容
print("响应内容:", response.text)

        上面的代码设置了一个HTTP代理服务器和一个HTTPS代理服务器,并使用这些代理服务器发送了一个GET请求。

4. SSL验证

        Requests库默认会对HTTPS请求进行SSL证书验证。你可以通过verify参数来控制是否进行SSL验证。通常,你可以将其设置为True来进行验证,或者设置为一个包含CA证书文件路径的字符串来指定验证证书。下面是一个示例:

import requests

# 发送HTTPS请求并进行SSL验证
response = requests.get('https://api.example.com/data', verify=True)

# 打印响应内容
print("响应内容:", response.text)

上面的代码发送了一个HTTPS请求,并进行了SSL验证。

八、异常处理

        在进行网络请求时,可能会遇到各种异常情况,比如网络连接问题、服务器错误、超时等。为了确保代码的健壮性和可靠性,我们需要对这些异常情况进行适当的处理。在这一部分,我们将讨论可能出现的异常情况,并展示如何使用异常处理机制来处理这些异常。

1. 网络连接问题

        网络连接问题是最常见的异常之一。如果无法连接到目标服务器,Requests库将抛出ConnectionError异常。你可以使用try-except语句来捕获并处理这个异常。下面是一个示例:

import requests

try:
    # 发送请求
    response = requests.get('https://api.example.com/data')
    # 检查响应状态码
    if response.status_code == 200:
        print("请求成功")
    else:
        print("请求失败:", response.status_code)
except requests.exceptions.ConnectionError:
    print("网络连接异常,无法连接到服务器")

        上面的代码尝试发送一个GET请求,如果无法连接到服务器,则会捕获ConnectionError异常,并打印出相应的错误信息。

2. 服务器错误

        有时服务器可能会出现错误,比如500 Internal Server Error。如果服务器返回了一个错误状态码,Requests库将抛出HTTPError异常。你可以使用try-except语句来捕获并处理这个异常。下面是一个示例:

import requests

try:
    # 发送请求
    response = requests.get('https://api.example.com/data')
    # 检查响应状态码
    response.raise_for_status()
    print("请求成功")
except requests.exceptions.HTTPError as err:
    print("服务器错误:", err)

        上面的代码尝试发送一个GET请求,如果服务器返回了一个错误状态码,则会捕获HTTPError异常,并打印出相应的错误信息。

3. 超时

        在发送请求时,可能会出现超时的情况,即服务器在规定的时间内没有响应。如果超时发生,Requests库将抛出Timeout异常。你可以使用try-except语句来捕获并处理这个异常。下面是一个示例:

import requests

try:
    # 发送请求并设置超时时间为1秒
    response = requests.get('https://api.example.com/data', timeout=1)
    print("请求成功")
except requests.exceptions.Timeout:
    print("请求超时")

        上面的代码尝试发送一个GET请求,并设置超时时间为1秒。如果在规定时间内没有收到响应,则会捕获Timeout异常,并打印出相应的错误信息。

九、性能优化

        虽然Requests库已经为我们提供了简单而强大的方式来发送HTTP请求,但在处理大量请求时,仍然有一些性能优化的技巧可以使用。下面是一些关于如何优化使用Requests库性能的建议:

1. 使用连接池

        默认情况下,每次发送请求时都会创建一个新的TCP连接。如果你需要发送大量的请求,可以使用连接池来重用已经建立的连接,以减少连接的建立和关闭开销。你可以使用requests.Session对象来创建一个会话,并设置连接池参数。下面是一个示例:

import requests

# 创建会话对象并设置连接池大小
session = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
session.mount('http://', adapter)
session.mount('https://', adapter)

# 使用会话对象发送请求
response = session.get('https://api.example.com/data')

# 关闭会话
session.close()

        上面的代码创建了一个会话对象session,并设置了连接池大小为100。通过使用会话对象发送请求,可以重用已经建立的连接,提高性能。

2. 使用持久连接

        持久连接允许客户端和服务器在多次请求之间保持TCP连接的状态,从而减少了连接的建立和关闭开销。在HTTP/1.1中,持久连接是默认启用的。你可以使用Connection: keep-alive头部来确保持久连接。下面是一个示例:

import requests

# 发送请求并设置持久连接头部
response = requests.get('https://api.example.com/data', headers={'Connection': 'keep-alive'})

# 打印响应内容
print("响应内容:", response.text)

        上面的代码发送了一个GET请求,并设置了持久连接头部。服务器收到请求后,将保持连接的状态,并在后续请求中重用相同的连接,提高性能。

3. 合理使用并发

        在某些场景下,可以通过并发发送多个请求来提高性能。你可以使用多线程、异步请求等方式来实现并发。然而,在使用并发时需要注意合理控制并发量,以避免对服务器造成过大的负载。下面是一个使用concurrent.futures模块实现多线程并发的示例:

import requests
import concurrent.futures

# 定义请求函数
def fetch_data(url):
    response = requests.get(url)
    return response.text

# 定义多个请求URL
urls = ['https://api.example.com/data1', 'https://api.example.com/data2', 'https://api.example.com/data3']

# 使用多线程并发发送请求
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    results = executor.map(fetch_data, urls)

# 打印响应内容
for result in results:
    print("响应内容:", result)

        上面的代码定义了一个fetch_data函数用于发送请求,并使用ThreadPoolExecutor来实现多线程并发发送请求。

十、案例

        Requests库在真实项目中被广泛应用,下面我们通过一些实际的案例分析来展示Requests库在不同场景下的应用。

1. 网络爬虫

        网络爬虫是Requests库应用的一个典型场景。通过发送HTTP请求,爬虫程序可以获取网页内容,并对其进行解析和提取信息。Requests库提供了简洁而强大的API,使得编写爬虫程序变得简单而高效。下面是一个简单的网络爬虫示例,用于获取网页内容:

import requests

# 发送GET请求获取网页内容
response = requests.get('https://www.example.com')

# 打印网页内容
print("网页内容:", response.text)

在实际项目中,网络爬虫可以用于数据采集、搜索引擎索引等场景。

2. API调用

        Requests库也广泛应用于调用各种Web API接口。许多Web服务提供了API接口,通过发送HTTP请求,我们可以与这些服务进行交互,并获取数据或执行操作。下面是一个调用GitHub API获取用户信息的示例:

import requests

# 发送GET请求调用GitHub API
response = requests.get('https://api.github.com/users/octocat')

# 解析JSON响应内容
user_info = response.json()

# 打印用户信息
print("用户名:", user_info['login'])
print("用户ID:", user_info['id'])
print("用户URL:", user_info['html_url'])

在实际项目中,API调用可以用于数据获取、服务集成等场景。

3. Web自动化测试

        Requests库也可以用于编写Web自动化测试脚本。通过发送HTTP请求,我们可以模拟用户与Web应用的交互,并进行自动化测试。下面是一个使用Requests库进行Web自动化测试的示例:

import requests

# 发送POST请求提交表单数据
response = requests.post('https://www.example.com/login', data={'username': 'user', 'password': '123456'})

# 检查登录是否成功
if 'Welcome, user!' in response.text:
    print("登录成功")
else:
    print("登录失败")

在实际项目中,Web自动化测试可以用于测试Web应用的功能和性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python实践笔记(一): 模块和包

1. 写在前面 最近在重构之前的后端代码,借着这个机会又重新补充了关于python的一些知识, 学习到了一些高效编写代码的方法和心得,比如构建大项目来讲,要明确捕捉异常机制的重要性, 学会使用try...except..finally&…

AI服务器相关知识

在当今社会,人工智能的应用场景愈发广泛,如小爱同学、天猫精灵等 AI 服务已深入人们的生活。随着人工智能时代的来临,AI 服务器也开始在社会各行业发挥重要作用。那么,AI 服务器与传统服务器相比,究竟有何独特之处&…

C-MAPSS数据集探索性分析

实验数据为商用模块化航空推进系统仿真C-MAPSS数据集,该数据集为NASA格林中心为2008年第一届预测与健康管理国际会议(PHM08)竞赛提供的引擎性能退化模拟数据集,数据集整体信息如下所示: 涡扇发动机仿真模拟模型如下图所示。 仿真建模主要针对…

【AI大模型】Transformers大模型库(五):AutoModel、Model Head及查看模型结构

目录​​​​​​​ 一、引言 二、自动模型类(AutoModel) 2.1 概述 2.2 Model Head(模型头) 2.3 代码示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预…

写给大数据开发,如何去掌握数据分析

这篇文章源于自己一个大数据开发,天天要做分析的事情,发现数据分析实在高大上很多,写代码和做汇报可真比不了。。。。 文章目录 1. 引言2. 数据分析的重要性2.1 技能对比2.2 业务理解的差距 3. 提升数据分析能力的方向4. 数据分析的系统过程4…

计算机提示msvcp120.dll如何修复,7个不同方法分享

msvcp120.dll 是 Microsoft Visual C Redistributable 的一个关键组件,它包含了 C 运行时库,这些库对基于 Visual C 编写的应用程序至关重要。当应用程序运行时,msvcp120.dll 会被加载到内存中以提供必要的函数和类支持。 一、msvcp120.dll功…

springboot与flowable(2):流程部署

一、创建项目 创建springboot项目添加相关依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.…

Android安全开发之 Provider 组件安全

Android系统中的Content Provider组件是一种用于在不同应用之间共享数据的机制。它提供了一种安全、可控的方式&#xff0c;允许应用访问其他应用的数据。然而&#xff0c;如果Provider组件的安全措施没有得到妥善实现&#xff0c;则可能会导致严重的安全漏洞&#xff0c;例如数…

深入理解C语言:main函数的奥秘

在C语言中&#xff0c;main函数是每个程序的入口点&#xff0c;起着至关重要的作用。本文将深入探讨main函数的工作原理&#xff0c;包括其参数、返回值、以及如何从main启动程序的执行。通过实际代码示例&#xff0c;读者将更深入地理解main函数在C语言编程中的核心地位。 第一…

SQL自动发送邮件的方法有哪些?如何配置?

SQL自动发送邮件设置时的注意事项&#xff1f;邮件群发如何操作&#xff1f; 在现代企业中&#xff0c;自动化流程越来越普遍&#xff0c;SQL自动发送邮件作为其中一项重要功能&#xff0c;能够大大提高工作效率并简化数据管理流程。AokSend将介绍几种实现SQL自动发送邮件的方…

MySQL限制登陆失败次数配置

目录 一、限制登陆策略 1、Windows 2、Linux 一、限制登陆策略 1、Windows 1&#xff09;安装插件 登录MySQL数据库 mysql -u root -p 执行命令安装插件 #限制登陆失败次数插件 install plugin CONNECTION_CONTROL soname connection_control.dll;install plugin CO…

探索软件工程师在新能源汽车研发中的角色与贡献

随着全球对可持续发展的关注不断增加&#xff0c;新能源汽车的研发与应用成为了汽车行业的一个重要方向。作为软件工程师&#xff0c;参与新能源汽车研发不仅能够推动科技创新&#xff0c;还能为环保事业贡献力量。本文将深入探讨软件工程师在新能源汽车研发中的具体贡献、所需…

VISIO安装教程+安装包

文章目录 01、什么是VISIO&#xff1f;02、安装教程03、常见安装问题解析 01、什么是VISIO&#xff1f; Visio是由微软开发的流程图和图表绘制软件&#xff0c;它是Microsoft Office套件的一部分。Visio提供了各种模板和工具&#xff0c;使用户能够轻松创建和编辑各种类型的图…

佳能5DMARK IV mov视频覆盖的恢复方法

5DMARK IV算是佳能比较经典的一款摄像机&#xff0c;是佳能早期使用MOV的摄像机之一&#xff0c;MOV是当初佳能高端机的象征&#xff0c;当然现在佳能已经不在通过MOV和MP4来区分硬件级别了。下边这个案例是文件拍摄时断电&#xff0c;结果变成0字节&#xff0c;然后覆盖了部分…

C语言最终讲:预处理详解

C语言最终讲&#xff1a;预处理详解 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏和函数的对比6.1宏的优势6.1.1\符号 6.2宏的劣势 7.#和##7.1#运算符7.2##运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1本地…

超详细 | 使用Nexus搭建私服 (带代码演示)

为什么需要搭建私有仓库&#xff1f; 在企业开发的过程中&#xff0c;不是所有公司都能直接访问外网。在这种情况下&#xff0c;就需要在局域网内找一台有外网访问权限的服务器&#xff0c;搭建Nexus私服仓库&#xff0c;开发人员连接到这台私服上&#xff0c;通过搭建的Nexus…

【学习笔记】finalshell上传文件夹、上传文件失败或速度为0

出现标题所述的情况&#xff0c;大概率是finalshell上传文件的过程中的权限不够。 可参照&#xff1a;Finalshell上传文件失败或者进度总为百分之零解决方法 如果不成功&#xff0c;建议关闭客户端重试。 同时建议在设置finalshell的ssh连接时根据不同用户设置多个连接&#xf…

RAG vs Fine-Tuning 微调哪种大模型(LLM)技术更好?

数据科学和机器学习的研究人员和从业者都在不断探索创新策略来增强语言模型的能力。在众多方法中&#xff0c;出现了两种突出的技术&#xff0c;即检索增强生成 (RAG)和微调。本文旨在探讨模型性能的重要性以及 RAG 和微调策略的比较分析。 模型性能在 NLP 中的重要性 增强用…

LinkedList详解(含数据结构动画演示)

目录 LinkedList详解1、LinkedList的继承体系2、LinkedList的构造函数3、LinkedList的add(E e)方法4、LinkedList的Node节点5、双向链表的概念和Node节点的详细解释6、LinkedList的add(E e)方法梳理7、LinkedList的getXXX方法8、LinkedList的removeXXX方法①、removeFirst()方法…

vue中插槽的本质

定义slotCompoent.vue 组件 <template><slot></slot><slot nameslot1></slot><slot name"slot2" msg"hello"></slot> </template>使用组件&#xff1a; <slotComponent><p>默认的</p>…