Python HTTP库——requests
文章目录
- 简介
- 安装
- 基本概念
- RESTfulAPI
- OAuth2.0
- Cookie和Session
- 初试
- GET请求
- POST请求
- PUT请求
- DELETE请求
- HEAD请求
- OPTIONS请求
- 传递查询参数
- 响应内容
- 自定义响应头
- 传递表单参数
- 传递文件
- 响应状态码
- 响应头
- Cookies
- 重定向和历史记录
- 超时
- 错误和异常
- Session对象
- 请求和响应对象
- 预处理请求
- SSL证书验证
- 客户端证书
- CA证书
- 响应体工作流
- 长连接
- 流式上传
- 分块编码请求
- POST多个Multipart-Encoded文件
- 事件钩子
- 自定义认证
- 流式请求
- 代理
- SOCKS协议
- HTTP动词
- 自定义动词
- Link头
- 转换适配器
- OAuth认证
- 下载图片
- 取消参数转义
- 转curl
- 封装
- 参考文献
简介
Requests
是一款优雅而简单的Python HTTP库,为人类而建
安装
pip install requests
基本概念
RESTfulAPI
每个网址代表一种资源,对于资源的具体操作类型,由 HTTP 动词表示:
- GET(SELECT):获取一项或多项资源
- POST(CREATE):新建一个资源
- PUT(UPDATE):更新并返回完整资源
- PATCH(UPDATE):更新并返回资源改变的属性
- DELETE(DELETE):删除资源
- HEAD:获取资源的元数据
- OPTIONS:获取资源信息,如哪些属性是客户端可以改变的
OAuth2.0
临时授权机制
Cookie和Session
HTTP 是无状态的,每次 HTTP 请求都是独立的
为了保持状态,在服务端保存 Session,在客户端(浏览器)保存 Cookies
浏览器每次请求附带上 Cookies,服务器通过识别 Cookies 鉴定出是哪个用户
Session 指有始有终的一系列动作,如打电话从拿起电话拨号到挂断电话这一过程可称为一个 Session
Session 在 Web 中用来存储用户属性及其配置信息
初试
GET 请求,模拟登录
import requestsr = requests.get('https://api.github.com/user', auth=('user', 'pass')) # 模拟登录
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
print(r.text)
print(r.json())
GET请求
import requestsr = requests.get('https://api.github.com/events')
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
print(r.text)
print(r.json())
# 200
# application/json; charset=utf-8
# utf-8
# ...
POST请求
import requestsr = requests.post('https://httpbin.org/post', data={'key': 'value'})
print(r.json())
使用文件流
import requestsfiles = {'file': open('test.txt', 'rb'),'key0': (None, 'value0'),'key1': (None, 'value1'),
}
response = requests.post('http://httpbin.org/post', files=files)
print(response.json())
或
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoderdata = {'file': open('test.txt', 'rb'),'key0': 'value0','key1': 'value1',
}
response = requests.post('http://httpbin.org/post', data=MultipartEncoder(data))
print(response.json())
PUT请求
import requestsr = requests.put('https://httpbin.org/put', data={'key': 'value'})
print(r.json())
DELETE请求
import requestsr = requests.delete('https://httpbin.org/delete')
print(r.json())
HEAD请求
import requestsr = requests.head('https://httpbin.org/get')
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
print(r.text)
OPTIONS请求
import requestsr = requests.options('https://httpbin.org/get')
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
print(r.text)
传递查询参数
在 url 中传递查询参数,如 http://httpbin.org/get?key=val
params
参数
import requestspayload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('https://httpbin.org/get', params=payload)
print(r.url) # https://httpbin.org/get?key1=value1&key2=value2
print(r.json())payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('https://httpbin.org/get', params=payload)
print(r.url) # https://httpbin.org/get?key1=value1&key2=value2&key2=value3
响应内容
import requestsr = requests.get('https://api.github.com/events')
print(r.text)
print(r.json())
print(r.encoding) # utf-8
自定义响应头
import requestsurl = 'https://api.github.com/some/endpoint'
headers = {'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers)
print(r.json())
传递表单参数
data
参数
import requestspayload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('https://httpbin.org/post', data=payload)
print(r.json())payload_tuples = [('key1', 'value1'), ('key1', 'value2')]
r = requests.post('https://httpbin.org/post', data=payload_tuples)
print(r.json())payload_dict = {'key1': ['value1', 'value2']}
r = requests.post('https://httpbin.org/post', data=payload_dict)
print(r.json())
传递 JSON-Encoded 数据,这两种方法等价
import json
import requestspayload = {'key1': 'value1', 'key2': 'value2'}
url = 'https://api.github.com/some/endpoint'
r = requests.post(url, data=json.dumps(payload))
r = requests.post(url, json=payload)
传递文件
import requestswith open('1.txt', mode='w') as f:f.write('123')url = 'https://httpbin.org/post'
files = {'file': open('1.txt', 'rb')}
r = requests.post(url, files=files)
print(r.json())files = {'file': ('1.txt', open('1.txt', 'rb'), 'text/plain', {'Expires': '0'})} # 设置filename、content_type、headers
r = requests.post(url, files=files)
print(r.json())files = {'file': ('1.csv', 'some,data,to,send\nanother,row,to,send\n')} # 字符串作为文件
r = requests.post(url, files=files)
print(r.json())
- 大文件用
requests-toolbelt
- 建议用二进制形式传输
响应状态码
import requestsr = requests.get('https://httpbin.org/get')
print(r.status_code) # 200
print(r.status_code == requests.codes.ok) # True
r.raise_for_status()bad_r = requests.get('https://httpbin.org/status/404')
print(bad_r.status_code) # 404
print(bad_r.status_code == requests.codes.not_found) # True
try:bad_r.raise_for_status()
except Exception as e:print(e) # 404 Client Error: NOT FOUND for url: https://httpbin.org/status/404
响应头
import requestsr = requests.get('https://api.github.com/events')
print(r.headers) # {'Server': 'GitHub.com', 'Date': 'Mon, 05 Sep 2022 10:35:42 GMT', ...}
print(r.headers['content-type']) # application/json; charset=utf-8
print(r.headers.get('content-type')) # application/json; charset=utf-8
Cookies
import requestsurl = 'https://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
print(r.json())
print(r.cookies)jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
url = 'https://httpbin.org/cookies'
r = requests.get(url, cookies=jar)
print(r.json())
print(r.cookies)
重定向和历史记录
使用响应对象的属性 history
来追踪重定向
import requestsr = requests.get('http://github.com/')
print(r.url) # 'https://github.com/'
print(r.status_code) # 200
print(r.history) # [<Response [301]>]r = requests.get('http://github.com/', allow_redirects=False) # 禁用重定向
print(r.status_code) # 301
print(r.history) # []r = requests.head('http://github.com/', allow_redirects=True)
print(r.url) # 'https://github.com/'
print(r.history) # [<Response [301]>]
超时
参数 timeout
指定超时停止响应时间
import requeststry:requests.get('https://github.com/', timeout=0.001)
except Exception as e:print(e)
错误和异常
网络问题,如 DNS 失败,拒绝连接,会引发异常 ConnectionError
HTTP 请求返回不成功的状态码,Response.raise_for_status()
会引发异常 HTTPError
请求超时,会引发异常 Timeout
请求超过最大重定向数,会引发异常 TooManyRedirects
所有异常都继承 requests.RequestException
Session对象
Session
对象能跨请求持久化某些参数,如 Cookies- 如果向同一主机发出多个请求,重用底层 TCP 连接可以显著提高性能
Session
对象有以上所有 API 方法,还可以为请求提供默认数据- 即使使用
Session
对象,方法级参数也不会跨请求持久化 - 手动添加 Cookies,使用
Session.cookies
Session
对象可以通过上下文管理器使用- 有时不需要
Session
对象的某参数,只需在方法级参数中将该键设为 None
import requests# Session对象能跨请求持久化某些参数,如Cookies
s = requests.Session()
s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get('https://httpbin.org/cookies')
print(r.json()) # {'cookies': {'sessioncookie': '123456789'}}# Session对象有所有API方法,还可以为请求提供默认数据
s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})
s.get('https://httpbin.org/headers', headers={'x-test2': 'true'}) # 同时发送x-test和x-test2# 即使使用Session对象,方法级参数也不会跨请求持久化
s = requests.Session()
r = s.get('https://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.json()) # {'cookies': {'from-my': 'browser'}}
r = s.get('https://httpbin.org/cookies')
print(r.json()) # {'cookies': {}}# Session对象可以通过上下文管理器使用
with requests.Session() as s:s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
维持 Session,相当于只开一个浏览器在请求
import requestswith requests.Session() as s:s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')r = s.get('http://httpbin.org/cookies')print(r.json())
请求和响应对象
调用 requests.get()
实际上在做两件事:
- 构造一个 Request 对象发送到服务器请求资源
- 一旦请求从服务器获得响应,生成一个 Response 对象
Response 对象有服务器返回的所有信息,还包含最初创建的 Request 对象
import requestsr = requests.get('https://en.wikipedia.org/wiki/Monty_Python')
print(r.headers)
print(r.request.headers)
预处理请求
无论怎样发起请求,实际使用的是 PreparedRequest
如果需要在发送请求前对请求体或头部做一些修改,见原文
SSL证书验证
类似浏览器验证 HTTPS 请求的 SSL 证书,如果无法验证将抛出 SSLError
- 参数
verify
可指定 CA 证书 - 受信任的 CA 列表也可以通过环境变量
REQUESTS_CA_BUNDLE
指定。如果没有设置REQUESTS_CA_BUNDLE
,CURL_CA_BUNDLE
会用于回调 - 参数
verify
设为False
则不进行 SSL 证书验证。但无论是否验证,都会接受服务器提供的 TLS 证书,并忽略和主机名不匹配或过期的证书,这样做可能会受到中间人(MitM)攻击 - 参数
verify
默认为True
,验证仅适用于 host 证书
import requestsr = requests.get('https://requestb.in')
print(r.text)r = requests.get('https://github.com')
print(r.text)r = requests.get('https://github.com', verify='/path/to/certfile')
# 上下两种方式类似
s = requests.Session()
s.verify = '/path/to/certfile'r = requests.get('https://kennethreitz.org', verify=False)
print(r) # <Response [200]>
客户端证书
指定本地证书为客户端证书,可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组
import requestsrequests.get('https://kennethreitz.org', cert=('/path/client.cert', '/path/client.key'))
# 或
s = requests.Session()
s.cert = '/path/client.cert'
本地证书对应的密钥必须为解密状态
CA证书
Requests
使用 certifiio
的证书,允许在不更新 Requests
版本的情况下更新其受信任的证书
在 2.16 版本之前,Requests
绑定了一组来自 Mozilla 的根 CA,每次 Requests
更新,证书也会更新
如果没有安装 certifiio
,在使用较旧版本的 Requests
时,会出现非常过时的证书
出于安全考虑,建议频繁更新证书!
响应体工作流
- 默认情况下,发出请求后,响应体会立即下载。可以改成访问
Response.content
时才下载响应体 - 请求时设置
stream=True
,连接不会释放,直到获取所有数据或调用Response.close()
,这样可能效率低下,建议用上下文管理器
import requeststarball_url = 'https://github.com/psf/requests/tarball/main'
r = requests.get(tarball_url, stream=True) # 此时只下载了响应头,仍然处于连接打开状态,可以进行有条件的内容检索TOO_LONG = 1024
if int(r.headers['content-length']) < TOO_LONG:content = r.content...with requests.get('https://httpbin.org/get', stream=True) as r:...
长连接
在 Session 中发出的请求都是长连接,且会自动重用合适的连接
流式上传
import requestswith open('massive-body', 'rb') as f:requests.post('http://some.url/streamed', data=f)
分块编码请求
import requestsdef gen():yield 'hi'yield 'there'requests.post('http://some.url/chunked', data=gen())
POST多个Multipart-Encoded文件
import requestsurl = 'https://httpbin.org/post'
multiple_files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
r = requests.post(url, files=multiple_files)
print(r.text)
事件钩子
import requestsdef print_url(r, *args, **kwargs):print(r.url)def record_hook(r, *args, **kwargs):r.hook_called = Truereturn rr = requests.get('https://httpbin.org/', hooks={'response': print_url})
print(r)
# https://httpbin.org/
# <Response [200]>r = requests.get('https://httpbin.org/', hooks={'response': [print_url, record_hook]})
print(r.hook_called)
# https://httpbin.org/
# Trues = requests.Session()
s.hooks['response'].append(print_url)
print(s.get('https://httpbin.org/'))
# https://httpbin.org/
# <Response [200]>
自定义认证
import requests
from requests.auth import AuthBaseclass PizzaAuth(AuthBase):"""Attaches HTTP Pizza Authentication to the given Request object."""def __init__(self, username):# setup any auth-related data hereself.username = usernamedef __call__(self, r):# modify and return the requestr.headers['X-Pizza'] = self.usernamereturn rprint(requests.get('http://pizzabin.org/admin', auth=PizzaAuth('kenneth')))
流式请求
import json
import requestsr = requests.get('https://httpbin.org/stream/20', stream=True)for line in r.iter_lines():if line:decoded_line = line.decode('utf-8')print(json.loads(decoded_line))r = requests.get('https://httpbin.org/stream/20', stream=True)
if r.encoding is None:r.encoding = 'utf-8'
for line in r.iter_lines(decode_unicode=True):if line:print(json.loads(line))
代理
参数 proxies
配置代理
import requestsproxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080',
}
requests.get('http://example.org', proxies=proxies)# 或为整个Session配置一次
proxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080',
}
session = requests.Session()
session.proxies.update(proxies)
session.get('http://example.org')
当代理配置没有覆盖每个请求时,检查 Requests
依赖的环境变量
export HTTP_PROXY="http://10.10.1.10:3128"
export HTTPS_PROXY="http://10.10.1.10:1080"
export ALL_PROXY="socks5://10.10.1.10:3434"
SOCKS协议
HTTP动词
自定义动词
Link头
转换适配器
OAuth认证
安装
pip install requests-oauthlib
代码
from requests_oauthlib import OAuth1Sessiontwitter = OAuth1Session('client_key',client_secret='client_secret',resource_owner_key='resource_owner_key',resource_owner_secret='resource_owner_secret')
url = 'https://api.twitter.com/1/account/settings.json'
r = twitter.get(url)
下载图片
取消参数转义
import requestsparams = {'username': 'abc','password': '%'
}
params = '&'.join('{}={}'.format(k, v) for k, v in params.items())
response = requests.get('https://httpbin.org/get', params=params)
print(response.json())
转curl
安装
pip install curlify
初试
import curlify
import requestsresponse = requests.get("http://google.ru")
print(curlify.to_curl(response.request))
# curl -X 'GET' -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'User-Agent: python-requests/2.18.4' 'http://www.google.ru/'print(curlify.to_curl(response.request, compressed=True))
# curl -X 'GET' -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'User-Agent: python-requests/2.18.4' --compressed 'http://www.google.ru/'
封装
参考文献
相关文章:
Python HTTP库——requests
文章目录 简介安装基本概念RESTfulAPIOAuth2.0Cookie和Session 初试GET请求POST请求PUT请求DELETE请求HEAD请求OPTIONS请求传递查询参数响应内容自定义响应头传递表单参数传递文件响应状态码响应头Cookies重定向和历史记录超时错误和异常Session对象请求和响应对象预处理请求SS…...
用idea配置springboot+mybatis连接postersql数据库
从socket开始,我们就要开始部署前后端的交互了,所以今天带来一份热度比较高的框架springboot,并教大家如何连接数据库。 框架 先给大家看一下目录结构,因为有些需要调用文件路径: 创建项目: 新版本可以…...
【补充篇】Davinci工具要求的dbc格式
1 简介 DBC文件是一种用于描述CAN(Controller Area Network,控制器局域网络)通信协议中报文和信号的格式化文件,其全称为“Database CAN”。DBC文件的核心作用是定义和解析CAN网络中的通信数据,包括节点、报文、信号及其属性等信息。 对于不同角色的工程师,DBC文件有着…...
IT资产管理(一)之GLPI安装及部署
一、GLPI 介绍 GLPI:Gestionnaire Libre de Parc Informatique 是一个免费的资产和 IT 管理软件包,提供 ITIL 服务台功能、许可证跟踪和软件审计。 GLPI 的主要功能: 服务资产和配置管理 (SACM):管理您的 IT 资产和配置,跟踪计算机、外围设备、网络打印机及其相关组件…...
RPCRT4!OSF_CCALL::ActivateCall函数分析之RPCRT4!OSF_CCALL结构中的Bindings--RPC源代码分析
第一部分: 1: kd> t RPCRT4!OSF_CCALL::ActivateCall: 001b:77bf5789 55 push ebp 1: kd> kc # 00 RPCRT4!OSF_CCALL::ActivateCall 01 RPCRT4!OSF_CASSOCIATION::AllocateCCall 02 RPCRT4!OSF_BINDING_HANDLE::AllocateCCall 03 RPCRT4!OS…...
docker登录AWS ECR拉取镜像
1、配置AWS 登录key [rootip-172-31-13-6 ~]# aws configure AWS Access Key ID [None]: XXXXXXXXXXX AWS Secret Access Key [None]: %%YYYDSRGTHFGFSGRTHTHE$RHTSG Default region name [None]: ap-southeast-1 Default output format [None]: json2、登录AWS ECR镜像仓库 …...
IntelliJ IDEA download JDK
IntelliJ IDEA download JDK 自动下载各个版本JDK,步骤 File - Project Structure (快捷键 Ctrl Shift Alt S) 如果下载失败,换个下载站点吧。一般选择Oracle版本,因为java被Oracle收购了 好了。 花里胡哨&#…...
MQTT协议与HTTP协议的对比分析
以下是MQTT协议与HTTP协议的对比分析,从协议特性到应用场景的系统性对比: 一、协议层级与设计目标对比 维度MQTTHTTP协议层级应用层协议(基于TCP/IP)应用层协议(基于TCP/IP)核心设计目标机器间轻量级消息通…...
jenkins凭据管理(配置github密钥)
1.凭据管理 添加两种类型的凭据,Username with password和Secret text(填的token) Username with password是github登录的用户名和密码,Secret text填的github生成的token,权限的限制更细,安全性更高一些 Dashboard -> Manag…...
B端小程序如何突破常规,成为企业获客新利器?
数据驱动的用户旅程优化 在当今竞争激烈的市场环境中,了解并优化用户的交互路径对于吸引和保留客户至关重要。B端小程序可以通过收集用户行为数据来分析用户偏好和使用习惯。例如,应用热图分析工具可以直观展示用户点击最频繁的区域,帮助企业…...
25.4.17学习总结
关于bcrypt算法 BCrypt 的主要特点和优点: 加盐 (Salting): BCrypt 会自动为每个密码生成一个随机的盐值 (salt) 并将其与密码组合在一起,然后再进行哈希。 盐值是随机数据,用于防止彩虹表攻击。 这意味着即使两个用户使用相同的密码&#x…...
java 设计模式 策略模式
简介 策略模式(Strategy Pattern)是一种行为设计模式,旨在定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。换句话说,策略模式通过将不同的算法…...
游戏盾和高防ip有什么区别
游戏盾和高防IP都是针对网络攻击的防护方案,但核心目标、技术侧重点和应用场景存在显著差异。以下是两者的详细对比分析: 一、核心定位与目标 维度高防IP游戏盾核心目标抵御大流量网络攻击(…...
关于 雷达(Radar) 的详细解析,涵盖其定义、工作原理、分类、关键技术、应用场景、挑战及未来趋势,结合实例帮助理解其核心概念
以下是关于 雷达(Radar) 的详细解析,涵盖其定义、工作原理、分类、关键技术、应用场景、挑战及未来趋势,结合实例帮助理解其核心概念: 一、雷达的定义与核心功能 1. 定义 雷达(Radar,Radio D…...
机器学习 Day11 决策树
1.决策树简介 原理:思想源于程序设计的 if - else 条件分支结构 ,是一种树形结构。内部节点表示属性判断,分支是判断结果输出,叶节点是分类结果 。案例:以母亲给女儿介绍男朋友为例。女儿依次询问年龄(≤3…...
【HFP】深入解析蓝牙 HFP 协议中呼叫转移、呼叫建立及保持呼叫状态的机制
目录 一、核心指令概述 1.1 ATCMER:呼叫状态更新的 “总开关” 1.2 ATBIA:指示器的 “精准控制器” 1.3 指令对比 1.4 指令关系图示 二、CIEV 结果码:状态传递的 “信使” 2.1 工作机制 2.2 三类核心指示器 三、状态转移流程详解 3…...
音频识别优化(FFT)
整合多频段检测、动态阈值调整和持续时长验证的完整代码实现,包含详细注释: #include "esp_dsp.h" #include "driver/i2s.h" #include "esp_log.h" #include "math.h" static const char* TAG "ADV_FRE…...
【Redis】Redis基本命令(1)
KEYS 返回所有满足样式(pattern)的key。 KEY * 返回所有key,不简易使用 性能问题:当 Redis 存储百万级键时,会消耗大量 CPU 和内存资源,Redis 是单线程模型,KEYS * 执行期间会阻塞其他所有命令…...
IDEA2024 pom.xml依赖文件包报红解决
异常: 原因: 本地的Maven Repository库中不存在对应版本的dependency依赖,所以导致报红。 解决: 方法1:找到对应项目,右键Sync Project 就可以了 方法2:修改setting中maven的自动更新…...
Qt 信号与槽复习
Qt 信号与槽复习 Qt 信号与槽(Signals and Slots)机制是 Qt 框架的核心特性之一,用于实现对象之间的通信。它提供了一种松耦合的方式,使得组件可以独立开发和复用,广泛应用于 GUI 编程、事件处理和跨模块交互。本文将…...
RestControllerAdvice 和 ControllerAdvice 两个注解的区别与联系
它们都用于实现全局的通用处理逻辑,主要应用在以下三个方面: 全局异常处理: 使用 ExceptionHandler 注解的方法。全局数据绑定: 使用 InitBinder 注解的方法。全局数据预处理: 使用 ModelAttribute 注解的方法。 联系: 核心功能相同: 两者都提供了上述…...
最快打包WPF 应用程序
在 Visual Studio 中右键项目选择“发布”,目标选“文件夹”,模式选“自包含”,生成含 .exe 的文件夹,压缩后可直接发给别人或解压运行,无需安装任何东西。 最简单直接的新手做法: 用 Visual Studio 的“…...
Java NIO Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接
什么是Java NIO? Java NIO(New Input/Output) 是Java 1.4(2002年)引入的一种非阻塞、面向缓冲区的输入输出框架,旨在提升Java在高性能和高并发场景下的I/O处理能力。它相比传统的 Java IO(java…...
C# 对列表中的元素的多个属性进行排序
目录 前言一、OrderBy、OrderByDescending、ThenBy、ThenByDescending二、Sort 前言 在开发过程中,我们经常需要 根据列表中的元素的某个属性进行排序,下面我们将简单介绍常用的排序函数。 例如此处有一个类,拥有的元素为编号和值 public …...
OpenCV颜色变换cvtColor
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的,但是在进行图像处理时需要用到灰度图、二值图、HSV(六角锥体模型,这个模型中颜色的…...
java IO/NIO/AIO
(✪▽✪)曼波~~~~!让曼波用最可爱的赛马娘方式给你讲解吧!(⁄ ⁄•⁄ω⁄•⁄ ⁄) 🎠曼波思维导图大冲刺(先看框架再看细节哦): 📚 解释 Java 中 IO、NIO、AIO 的区别和适用场景: …...
如何深入理解引用监视器,安全标识以及访问控制模型与资产安全之间的关系
一、核心概念总结 安全标识(策略决策的 “信息载体) 是主体(如用户、进程)和客体(如文件、数据库、设备)的安全属性,用于标记其安全等级、权限、访问能力或受保护级别,即用于标识其安全等级、权限范围或约束…...
宜搭与金蝶互通——连接器建立
一、 进入连接器工厂 图1 连接器入口 二、 新建连接器 图2 新建连接器第一步 1、 连接器显示名,如图2中①所示; 2、 图2中②域名,是金蝶系统API接口里面的“完整服务地址”com之前的信息,不含“https”,如图3中①所示; 3、 Base Url通常为“/”,如图2…...
中间件--ClickHouse-7--冷热数据分离,解决Mysql海量数据瓶颈
在web应用中,当数据量非常大时,即使MySQL的存储能够满足,但性能一般也会比较差。此时,可以考虑使用ClickHouse存储历史数据,在Mysql存储最近热点数据的方式,来优化和提升查询性能。ClickHouse的设计初衷就是…...
1.1 设置电脑开机自动用户登录exe开机自动启动
本文介绍两个事情: 1.Windows如何开机自动登录系统(不用输密码) 2. 应用程序(.exe)如何开机自动启动 详细解释如下: 一、Windows如何开机自动登录系统(不用输密码) 设备上的工控机,如果开机后都需要操作人员输入密码&…...
vscode stm32 variable uint32_t is not a type name 问题修复
问题 在使用vscodekeil开发stm32程序时,发现有时候vscode的自动补全功能失效,且problem窗口一直在报错。variable “uint32_t” is not a type name uint32_t 定义位置 uint32_t 实际是在D:/Keil_v5/ARM/ARMCC/include/stdint.h中定义的。将D:/Keil_v5…...
动态规划与记忆化搜索的区别与联系
记忆化搜索(Memoization)和动态规划(Dynamic Programming, DP)都是解决重叠子问题的高效算法技术,但它们有着不同的实现方式和特点。 1. 基本概念 记忆化搜索(自顶向下) 本质:带有…...
html+js+clickhouse环境搭建
实验背景: 我目前有一台服务器A,和一台主机B,两台设备属于同一局域网,相互之间可以通讯。服务器A中部署着clickhouse,我在主机B中想直接通过javascript代码访问服务器中的clickhouse数据库并获取数据。 ClickHouse 服务…...
生命护航行动再启航!
温州好人陈飞携防溺水课堂,为乡村少年宫筑起安全防线 图文作者:华夏之音/李望 随着夏日热浪的滚滚而来,楠溪江畔的安全警钟再次响起。在这片如诗如画的土地上,一场旨在保护青少年生命安全的防溺水课堂活动拉开了…...
Android Compose Activity 页面跳转动画详解
下面我将全面详细地介绍在 Compose 中实现 Activity 跳转动画的各种方法,包括基础实现、高级技巧和最佳实践。 一、基础 Activity 过渡动画 1. overridePendingTransition 传统方式 这是最基础且兼容性最好的方法,适用于所有 Android 版本。 实现步骤…...
Android启动初始化init.rc详解
1. Android启动与init.rc简介 1.1 Android启动过程 一张图简单阐述一下 (网络图片,侵删) 1.2 init.rc 简介 Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。这些…...
Linux驱动开发-①regmap②IIO子系统
Linux驱动开发-IIO驱动 一,regmap二,IIO子系统2.1初始化相关工作2.2 通道2.3 读实现 over 一,regmap 对于spi和i2c,读写寄存器的框架不同,但设备本质一样,因此就有了regmap模型来对其进行简化,提供统一的接…...
HTML5好看的水果蔬菜在线商城网站源码系列模板5
文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址&#…...
L2-033 简单计算器满分笔记
本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就…...
其他网页正常进入,但是CSDN进入之后排版混乱
显示不正常,排版混乱 解决方法: ①打开网络设置 ②更改适配器 ③所连接的网络 --右键 属性 然后就可以正常访问了。...
BFC详解
1.定义: FC的全称为Formatting Conttext,元素在标准流里面 块级元素的布局属于Block Formatting Context(BFC)——即block level box都是BFC中布局 行内级元素的布局属于Inline Formatting Context (IFC) 2.那么在哪些情况下会创建BFC? 根元素…...
(H3C)vlan配置实验
1.实验拓扑 2.实验配置 [S1]dis cu #version 7.1.070, Alpha 7170 #sysname S1 # vlan 10 # vlan 20 # interface GigabitEthernet1/0/1port link-mode bridgeport link-type trunkport trunk permit vlan 1 10 20combo enable fiber # interface GigabitEthernet1/0/2port li…...
idea mvn执行打包命令后控制台乱码
首先在idea中查看maven的编码方式 执行mvn -v命令 查看编码语言是GBK C:\Users\13488>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_202, vendor: Oracle Corporation, runt…...
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识 在 JavaScript 开发中,**深拷贝(Deep Copy)**是一个常见需求,尤其是在处理复杂对象和嵌套数据结构时。JSON.parse(JSON.stringify(o…...
搭建用友U9Cloud ERP及UAP IDE环境
应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…...
Linux 系统新磁盘分区XFS挂载
以下是Linux系统中对新硬盘进行XFS文件系统格式化和挂载的完整操作指南: 一、确认硬盘识别 查看已识别硬盘 执行 lsblk 或 fdisk -l 命令,确认新硬盘设备标识(如 /dev/sdb)。 二、硬盘分区(可选) …...
Oracle测试题目及笔记(单选)
所有题目来自于互联网搜索 当 Oracle 服务器启动时,下列哪种文件不是必须的(D)。 A.数据文件 B.控制文件 C.日志文件 D.归档日志文件 数据文件、日志文件-在数据库的打开阶段使用 控制文件-在数…...
C语言链接数据库
目录 使用 yum 配置 mysqld 环境 查看 mysqld 服务的版本 创建 mysql 句柄 链接数据库 使用数据库 增加数据 修改数据 查询数据 获取查询结果的行数 获取查询结果的列数 获取查询结果的列名 获取查询结果所有数据 断开链接 C语言访问mysql数据库整体源码 通过…...
深入浅出 Redis:核心数据结构解析与应用场景Redis 数据结构
引言:Redis 为何如此之快?数据结构是关键 Redis (Remote Dictionary Server) 作为一款高性能的内存键值数据库,凭借其闪电般的速度和丰富的功能,在缓存、消息队列、排行榜等众多场景中得到了广泛应用。除了基于内存存储这一核心优…...
告别昂贵语音合成服务!用GPT-SoVITS生成你的个性化AI语音
文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天给大家介绍一款AI语音克隆工具——GPT-SoVITS。这款由花儿不哭大佬开发的工具是一款强大的训练声音模型与音频生成工具…...