首页
/ requests 怎么发送 MKCOL 等自定义 HTTP 动词?使用 request() 方法对接 WebDAV 服务

requests 怎么发送 MKCOL 等自定义 HTTP 动词?使用 request() 方法对接 WebDAV 服务

2026-09-08 18:25:13作者:柏廷章Berta

对接 WebDAV 类服务时,经常会用到 MKCOL(在文档中作为部分 WebDAV 服务器使用的动词示例)、PROPFIND 这类不在 getpostput 等快捷方法覆盖范围内的 HTTP 动词。requests 的顶层 API 只封装了常见的少数几种请求方式,但底层的 :func:request <requests.api.request> 方法接受任意动词字符串作为第一个参数,因此任何服务器允许的方法动词都能通过它发出。本文以发送 MKCOL 为例,给出从安装、发请求到验证响应、处理认证和异常的完整操作路径。

准备环境

在任意终端中用 pip 安装 requests(来自安装文档):

$ python -m pip install requests

安装完成后即可 import requests

用 request() 发送 MKCOL 请求

requests 顶层的 request() 签名是 request(method, url, **kwargs),其中 method 是一个字符串,文档在自定义动词一节中给出的 WebDAV 示例如下:

import requests

# url 和 data 替换为你自己的 WebDAV 服务器地址和请求体
url = "https://your-webdav-server.example.com/path/to/collection"
data = b"some data"

r = requests.request('MKCOL', url, data=data)

文档对该示例的说明是:服务器响应示例为 r.status_code 返回 200(文档原话是 "Assuming your call was correct",即假定你的调用是正确的,这只是文档示例输出,不是固定预期)。同一写法适用于服务器允许的任何其他动词,只需替换第一个参数,例如 requests.request('PROPFIND', url)

getpost 等快捷方法相比,request() 还多接收一个 method 参数,但其余行为一致:它内部创建一个临时 Session,把 methodurl**kwargs 交给 session.request() 处理并返回 Response 对象,见 src/requests/api.py

验证响应

发完请求后,用返回的 Response 对象判断结果(来自快速上手文档):

# 状态码
print(r.status_code)

# 与常用状态常量比较
print(r.status_code == requests.codes.ok)

# 读取响应体(文本或字节)
print(r.text)
print(r.content)

# 读取响应头,字典键大小写不敏感
print(r.headers['Content-Type'])

如果收到 4XX/5XX 响应,可以主动抛出异常来中断流程:

r.raise_for_status()  # 非 2XX/3XX 时抛出 requests.exceptions.HTTPError

文档特别指出:r.json() 调用成功并不代表请求成功(服务器可能在 500 响应里返回 JSON 错误详情),判断请求是否成功应使用 r.raise_for_status() 或检查 r.status_code 是否符合预期。

为 WebDAV 请求添加认证

文档中没有 WebDAV 专属的认证封装,但 request() 接受与其他请求方法相同的 authheadersdata 等参数(见 src/requests/api.py 中的参数说明)。需要 Basic Auth 时,可以直接复用文档中给出的方式(认证文档advanced.rst 的示例):

from requests.auth import HTTPBasicAuth

auth = HTTPBasicAuth('user', 'password')  # 替换为实际账号密码
r = requests.request('MKCOL', url, data=data, auth=auth)

其他常用参数(均见 request() 的文档字符串):

  • params:以字典形式附加查询字符串;
  • data:请求体,字典会自动做 form 编码,字符串/字节则原样发送;
  • headers:附加自定义 HTTP 头,如 requests.request('MKCOL', url, headers={'User-Agent': 'my-app/0.0.1'})。注意 Authorization 头在遇到跨主机重定向时会被移除;
  • timeout:秒数,超时抛出 requests.exceptions.Timeout。文档建议几乎所有生产代码都应设置该参数,否则程序可能无限挂起。

需要多次调用同一服务器时使用 Session

顶层 requests.request() 每次调用都会新建并关闭一个 Session(源码中用 with sessions.Session() as session 包裹)。如果脚本要对同一 WebDAV 服务器连续执行 MKCOL、PROPFIND 等多个操作,可以直接维护一个 Session 并调用它的 request() 方法:

s = requests.Session()
r = s.request('MKCOL', url, data=data, auth=auth, timeout=5)
# 后续请求继续复用 s.request(...)
s.close()

常见异常对照

来自快速上手文档的 Errors and Exceptions 一节

现象 异常
网络问题(DNS 失败、连接被拒绝等) requests.exceptions.ConnectionError
HTTP 请求返回不成功状态码且调用了 raise_for_status() requests.exceptions.HTTPError
等待响应超时 requests.exceptions.Timeout
超过最大重定向次数 requests.exceptions.TooManyRedirects

以上异常都继承自 requests.exceptions.RequestException,捕获这一基类即可统一处理。另外,allow_redirects 参数可以开启或关闭 GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD 的重定向跟随,对自定义动词的默认行为文档未单独说明,遇到返回 301/302 时可显式设置该参数观察行为。

限制说明

  • 文档只给出 requests.request('MKCOL', url, data=data) 这一层支持:动词本身由服务器端实现,requests 只负责把方法名原样放入请求行,不会替你实现 WebDAV 协议逻辑(如 PROPFIND 的响应体解析)。
  • 成功状态码取决于服务器实现,文档中的 200 仅是示例输出,不能作为固定断言。
  • request() 的参数文档中 method 示例列举的是 GET/OPTIONS/HEAD/POST/PUT/PATCH/DELETE,但参数类型为字符串,advanced.rst 明确说明"you can make use of any method verb that your server allows"。
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
898
5.82 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
921
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.8 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
391