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产品
认知负荷理论主要探讨在学习过程中,人脑处理信息的有限容量以及如何优化信息的呈现方式以促进学习。认知负荷定律认为,学习者的工作记忆容量是有限的,而不同类型的认知任务会对工作记忆产生不同程度的负荷,从而影响学习效果。以下…...
【C++11】常见的c++11新特性(一)
文章目录 1. C11 简介2. 常见的c11特性3.统一的列表初始化3.1initializer_list 4. decltype与auto4.1decltype与auto的区别 5.nullptr6.右值引用和移动语义6.1左值和右值6.1.1左值的特点6.1.2右值的特点6.1.3右值的进一步分类 6.2左值引用和右值引用以及区别6.2.1左值引用6.2.2…...
牛客周赛 Round 46 题解 C++
目录 A 乐奈吃冰 B 素世喝茶 C 爱音开灯 D 小灯做题 E 立希喂猫 F 祥子拆团 A 乐奈吃冰 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <set> #include <vector>…...
9.3 Go 接口的多态性
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
Java通过字符串字段匹配形成树形结构
Java通过字符串字段匹配形成树形结构 文章目录 Java通过字符串字段匹配形成树形结构数据表模拟数据解决办法:1、domian 类:2、Node层(形成树形关系):3、controller 层4、Util 工具类1、BeanCopierUtil4、Mapper5、Manager(用来组装树形结构)6、测试:有的时候我们形成树形不…...
数字孪生智慧水利:精准管理与智能决策的新时代
图扑数字孪生技术在智慧水利中的应用,通过虚拟模型与真实水利系统的无缝连接,实现对水资源和水利工程的全面监控和精细管理。实时数据采集与动态模拟提升了水利系统的预测和响应能力,从洪水预警到水质监测,数字孪生助力各项决策更…...
基于ChatGLM3的本地问答机器人部署流程
基于ChatGLM3的本地问答机器人部署流程 前言一、确定文件结构1.新建文件夹储存本地模型2.下载源码和模型 二、Anaconda环境搭建1.创建anaconda环境2.安装相关库3.设置本地模型路径4.启动 三、构建本地知识库1.下载并安装postgresql2.安装c库3.配置向量插件 四、线上运行五、 全…...
归并排序——逆序数对的统计
逆序数对的统计 题目描述 运行代码 #include <iostream> using namespace std; #define LL long long const int N 1e5 5; int a[N], tmp[N]; LL merge_sort(int q[], int l, int r) {if (l > r)return 0; int mid l r >> 1; LL res merge_sort(q, l,…...
基于截图和模拟点击的自动化压测工具开发(MFC)
1.背景 想对一个MFC程序做自动压测功能,根据判断程序界面某块区域是否达到预定状态,来自动执行鼠标点击或者键盘输入的操作,以解决测试人员需要重复手动压测问题。 1.涉及的技术 串口控制,基于MFC橡皮筋类(CRectTracker)做一个…...
力扣每日一题 6/10
881.救生艇[中等] 题目: 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船…...
[知识点] 内存顺序属性的用途和行为
C标准库中定义了以下几种内存顺序属性: std::memory_order_relaxedstd::memory_order_consumestd::memory_order_acquirestd::memory_order_releasestd::memory_order_acq_relstd::memory_order_seq_cst 1. std::memory_order_relaxed 定义:不提供同步…...
第三方做网站/国内新闻最新消息今天简短
一、安装单节点kafka(自己测试过) 1、创建zookeeper服务 zookeeper-service.yaml内容如下: #Service apiVersion: v1 kind: Service metadata:name: kafka-zookeeper-servicenamespace: paas-basiclabels:name: zookeeper-service spec: …...
怎么建立网站管理系统/厦门网站推广费用
python 文件操作 python:目录与文件操作 os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os.curdir:返回但前目录(’.’) os.chdir(dirname):改变工作目录到dirname os.path.isdir(name):判断name是不是…...
建h5网站费用/裤子seo标题优化关键词
者利用了三种表现形式: 1,选择截图路径的方法 2,直接截取截屏的方法 3,截取鼠标圈选区域。 上代码,: 第一种是调用.net的类库,需要引用System.Windows.Forms.dll,在Assents文件夹里新…...
网站文章标题/网络营销策略的演变
115. 不同的子序列 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如࿰…...
如今做那个网站致富/今日国内新闻头条15条
#define MAXLINE 4096/**************程序流程*******************1 用socket()函数创建一个socket2 用bind()绑定到一个本地的地址,这样其他的socket可以用connect()连接上去3 用listen()指出愿意接收连接并指定进来的连接的队列限制4 用accept()函数来接收连接***…...
空间网站建设/百度推广登陆后台
ping命令是一种测试两台设备之间网络连通性的命令。在Linux操作系统中,使用ping命令可以测试本机与其他设备之间的网络连通性。 基本语法: ping [options] [destination] 常用选项: -c count:指定ping命令的发送次数ÿ…...