Python Requests库详解

大家好,在现代网络开发中,与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库之所以如此流行,是因为它具有以下几个显著的优点:
-
简单易用:Requests提供了简洁而直观的API,使得发送HTTP请求变得非常容易。开发人员无需处理复杂的细节,只需几行代码就可以完成常见的网络通信任务。
-
功能丰富:尽管Requests提供了简单的接口,但它同时也提供了许多强大的功能和高级选项,满足了各种复杂场景下的需求。无论是处理会话、处理重定向、进行身份验证还是设置代理,Requests都能轻松胜任。
-
文档齐全:Requests拥有清晰、详细的官方文档,涵盖了库的各个方面,包括基本用法、高级功能、示例代码等。这使得开发人员可以轻松查阅文档,解决各种问题。
-
活跃的社区支持: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 requeststry:# 发送请求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 requeststry:# 发送请求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 requeststry:# 发送请求并设置超时时间为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应用的功能和性能。
相关文章:
Python Requests库详解
大家好,在现代网络开发中,与Web服务器进行通信是一项至关重要的任务。Python作为一种多才多艺的编程语言,提供了各种工具和库来简化这一过程。其中,Requests库作为Python中最受欢迎的HTTP库之一,为开发人员提供了简单而…...
Kafka 详解:全面解析分布式流处理平台
Kafka 详解:全面解析分布式流处理平台 Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流式应用。它具有高吞吐量、低延迟、高可用性和高可靠性的特点,广泛应用于日志收集、数据流处理、消息系统、实时分析等场景。 &…...
RabbitMQ系列-rabbitmq无法重新加入集群,启动失败的问题
当前存在3个节点:rabbitmq5672、rabbitmq5673、rabbitmq5674 当rabbitmq5673节点掉线之后,重启失败 重启的时候5672节点报错如下: 解决方案 在集群中取消失败节点 rabbitmqctl forget_cluster_node rabbitrabbitmq5673删除失败节点5673的…...
postgresql之翻页优化
列表和翻页是所有应用系统里面必不可少的需求,但是当深度翻页的时候,越深越慢。下面是几种常用方式 准备工作 CREATE UNLOGGED TABLE data (id bigint GENERATED ALWAYS AS IDENTITY,value double precision NOT NULL,created timestamp with time zon…...
小白学Linux | 日志排查
一、windows日志分析 在【运行】对话框中输入【eventvwr】命令,打开【事件查看器】窗 口,查看相关的日志 管理员权限进入PowerShell 使用Get-EventLog Security -InstanceId 4625命令,可获取安全性日志下事 件 ID 为 4625(失败登…...
Spring6
一 概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…...
数字孪生概念、数字孪生技术架构、数字孪生应用场景,深度长文学习
一、数字孪生起源与发展 1.1 数字孪生产生背景 数字孪生的概念最初由Grieves教授于2003年在美国密歇根大学的产品全生命周期管理课程上提出,并被定义为三维模型,包括实体产品、虚拟产品以及二者间的连接,如下图所示: 2011年&…...
云服务对比:阿里云国际站和阿里云国内站有什么区别
阿里云国际站(Alibaba Cloud International)和阿里云国内站(Alibaba Cloud China)在许多方面存在明显区别,这些区别主要体现在服务范围、合规性、定价和支付方式、语言和客服支持、以及备案要求等方面。 首先…...
如何在npm上发布自己的包
如何在npm上发布自己的包 npm创建自己的包 一、一个简单的创建 1、创建npm账号 官网:https://www.npmjs.com/创建账号入口:https://www.npmjs.com/signup 注意:需要进入邮箱验证 2、创建目录及初始化 $ mkdir ufrontend-test $ cd ufron…...
SQL Chat:从SQL到SPEAKL的数据库操作新纪元
引言 SQL Chat是一款创新的、对话式的SQL客户端工具。 它采用自然语言处理技术,让你能够像与人交流一样,通过日常对话的形式对数据库执行查询、修改、创建及删除操作 极大地简化了数据库管理流程,提升了数据交互的直观性和效率。 在这个框…...
jmeter性能优化之mysql配置
一、连接数据库和grafana 准备:连接好数据库和启动grafana并导入mysql模板 大批量注册、登录、下单等,还有过节像618,双11和数据库交互非常庞大,都会存在数据库的某一张表里面,当用户在登录或者查询某一个界面时&…...
VueRouter3学习笔记
文章目录 1,入门案例2,一些细节高亮效果非当前路由会被销毁 3,嵌套路由4, 传递查询参数5,命名路由6,传递路径参数7,路径参数转props8,查询参数转props9,replace模式10&am…...
「前端+鸿蒙」鸿蒙应用开发-TS函数
在 TypeScript 中,函数是一等公民,这意味着函数可以作为参数传递、作为其他函数的返回值,甚至可以赋值给变量。TypeScript 为 JavaScript 的函数增加了类型系统,使得函数的参数和返回值都具有明确的类型。 TS快速入门-函数 基本函…...
python后端结合uniapp与uview组件tabs,实现自定义导航按钮与小标签颜色控制
实现效果(红框内): 后端api如下: task_api.route(/user/task/states_list, methods[POST, GET]) visitor_token_required def task_states(user):name_list [待接单, 设计中, 交付中, 已完成, 全部]data []color [#F04864, …...
mingw如何制作动态库附python调用
1.mingw和msvc g -fpic HelloWorld.cpp -shared -o test.dllg -L . -ltest .\test.cpp 注意-L后面的.挨不挨着都行,-l不需要-ltest.dll,只需要-ltest 2.dll.cpp extern "C" {__declspec(dllexport) int __stdcall add(int a, int b) {return…...
Vue学习|Vue快速入门、常用指令、生命周期、Ajax、Axios
什么是Vue? Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写 基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。官网:https://v2.cn.vuejs.org/ Vue快速入门 打开页面࿰…...
Python基础教程(八):迭代器与生成器编程
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...
Oracle10.2.0.1冷备迁移之_数据文件拷贝方式
由于阿里云机房要下架旧服务器,单位未购买整机迁移服务,且业务较老不兼容Oracle11g,所以新购买一台新服务器进行安装Oracle10.2.0.1 ,后续再将数据迁移到新服务器上。 id 数据库版本 操作系统版本 实例名 源库 115.28.242.25…...
智能合约中外部调用漏洞
外部调用 : 在智能合约开发中,调用不受信任的外部合约是一个常见的安全风险点。这是因为,当你调用另一个合约的函数时,你实际上是在执行那个合约的代码,而这可能会引入你未曾预料的行为,包括恶意行为。下面…...
转型AI产品经理(4):“认知负荷”如何应用在Chatbot产品
认知负荷理论主要探讨在学习过程中,人脑处理信息的有限容量以及如何优化信息的呈现方式以促进学习。认知负荷定律认为,学习者的工作记忆容量是有限的,而不同类型的认知任务会对工作记忆产生不同程度的负荷,从而影响学习效果。以下…...
终极泰坦之旅仓库管理指南:告别背包爆满,开启无限存储新时代
终极泰坦之旅仓库管理指南:告别背包爆满,开启无限存储新时代 【免费下载链接】TQVaultAE Extra bank space for Titan Quest Anniversary Edition 项目地址: https://gitcode.com/gh_mirrors/tq/TQVaultAE 你是否曾因《泰坦之旅》背包空间不足而忍…...
从零到一:联想小新Air14 2020锐龙版Windows 10重装实战指南
1. 为什么需要重装系统? 最近有不少朋友跟我吐槽,说用了两年的联想小新Air14 2020锐龙版越来越卡,开机要等半天,打开个文档都要转圈圈。这种情况我太熟悉了,作为一个帮朋友修过不下20台同款机型的老司机,我…...
从Simulink模型到C代码:Assignment模块的‘Index Mode’选Zero还是One?一个影响深远的决定
从Simulink模型到C代码:索引模式选择的工程实践指南 在嵌入式软件开发中,模型与代码的协同设计一直是提高开发效率的关键环节。当Simulink模型工程师将算法模型转换为C代码时,一个看似简单的参数配置——Assignment模块的"Index Mode&q…...
【信息科学与工程学】【财务管理】 第二十三篇 ICT行业商业逻辑分析框架03
136. 硅光子集成芯片的激光器外延片 行业代码 行业名称 行业级别 产品/服务 商业逻辑核心 投资者类型与代表公司/机构 外部关系类型与关联公司 销售与买卖经营 供应链经营 利益/利润设计/资源绑定/信息宣传 分销商/代理商/关系节点 销售策略、打法与复杂关系网络 3…...
WindowResizer:突破Windows窗口限制的精准尺寸控制工具
WindowResizer:突破Windows窗口限制的精准尺寸控制工具 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 在Windows桌面环境中,应用程序窗口尺寸管理是影响工…...
从课堂到代码:三大数学可视化工具实战解析
1. 数学可视化工具的选择困境 第一次接触数学可视化工具时,我被各种选项搞得眼花缭乱。作为数学老师,我需要一个能让学生快速上手的工具;作为编程爱好者,我又希望它能支持更复杂的算法可视化。经过多年实践,我发现Desm…...
League-Toolkit终极指南:英雄联盟玩家的智能自动化神器
League-Toolkit终极指南:英雄联盟玩家的智能自动化神器 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 如果你是英雄联盟玩家&…...
如何用Rusted PackFile Manager彻底重构全面战争模组开发工作流?
如何用Rusted PackFile Manager彻底重构全面战争模组开发工作流? 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: h…...
BUUCTF实战:从内存镜像到加密容器——[VN2020]内存取证全流程解析
1. 初识内存取证:从CTF赛题到实战思维 第一次接触内存取证是在去年的BUUCTF比赛中,当时看到那道[V&N2020]公开赛题目完全摸不着头脑。现在回想起来,内存取证就像是在案发现场收集指纹——只不过我们面对的是计算机运行时留下的"数字…...
机械革命S2 Air/Code 01避坑指南:搞定WSL2和Docker,先搞定这3个驱动和BIOS
机械革命S2 Air/Code 01深度调优:WSL2与Docker稳定运行的三大核心策略 当机械革命S2 Air或Code 01遇上WSL2和Docker,不少技术爱好者会发现这条路并不平坦。蓝屏、WiFi断连、系统崩溃——这些看似随机的问题背后,其实隐藏着Windows系统版本、硬…...
