Python发送digest认证的请求:requests.auth.HTTPDigestAuth/httpx.DigestAuth

近日在做摄像头接口的调试,需要用到Digest认证,经过试验,代码如下:

一、同步版(pip install requests)

python 复制代码
import requests
from requests.auth import HTTPDigestAuth

host = 'https://192.168.0.2'
path = '/api/xxx'
path2 = '/another/api'

AUTH = ('username', 'password')
r = requests.get(host+path, verify=False, auth=HTTPDigestAuth(*AUTH))
print(r.status_code)
print(r.text)

payload = {'a': 1}
r2 = requests.put(host+path2, verify=False, auth=HTTPDigestAuth(*AUTH), json=payload)
print(r2.status_code)
print(r2.json())

二、异步协程版(pip install httpx)

python 复制代码
import asyncio
from httpx import AsyncClient, DigestAuth

host = 'https://192.168.0.2'
path = '/api/xxx'
path2 = '/another/api'

AUTH = ('username', 'password')


async def main():
    async with AsyncClient(base_url=host, verify=False, auth=DigestAuth(*AUTH)):
        r = await client.get(path)
        payload = {'a': 1}
        r2 = await client.put(path2, json=payload)
    print(r.status_code)
    print(r.text)

    print(r2.status_code)
    print(r2.json())


if __name__ == '__main__':
    asyncio.run(main())

封装成工具类之后的代码如下

python 复制代码
import os

import requests
from httpx import AsyncClient, DigestAuth

AUTH = (os.environ["API_USER"], os.environ["API_PASS"])


class HttpClient:
    PATH_GET = "/get-sth"
    PATH_PUT = "/put"

    @staticmethod
    def sync_request(method: str, host: str, path: str, **kw) -> requests.Response:
        url = host.rstrip("/") + path
        return requests.request(
            method, url, verify=False, auth=requests.auth.HTTPDigestAuth(*AUTH), **kw
        )

    @classmethod
    def sync_get(cls, host: str, params=None, path: str | None = None) -> dict:
        if path is None:
            path = cls.PATH_GET
        r = cls.sync_request("GET", host, path, params=params)
        r.raise_for_status()
        return r.json()

    @classmethod
    def sync_put(cls, payload: dict, host: str, path: str | None = None) -> dict:
        if path is None:
            path = cls.PATH_PUT
        r = cls.sync_request("PUT", host, path, json=payload)
        r.raise_for_status()
        return r.json()

    @staticmethod
    def async_client(host: str) -> AsyncClient:
        return AsyncClient(base_url=host, verify=False, auth=DigestAuth(*AUTH))

    @classmethod
    async def get(cls, host: str, params=None, path: str | None = None) -> dict:
        async with cls.async_client(host) as client:
            r = await client.get(path or cls.PATH_GET, params=params)
            return r.json()

    @classmethod
    async def put(cls, payload: dict, host: str, path: str | None = None) -> dict:
        async with cls.async_client(host) as client:
            r = await client.put(path or cls.PATH_PUT, json=payload)
            return r.json()
相关推荐
THMAIL1 天前
深度学习从入门到精通 - 神经网络核心原理:从生物神经元到数学模型蜕变
人工智能·python·深度学习·神经网络·算法·机器学习·逻辑回归
dbdr09011 天前
Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十六天
linux·运维·服务器·网络·python·学习
花花无缺1 天前
python自动化-pytest-用例发现规则和要求
后端·python
YUELEI1181 天前
langchain 提示模版 PromptTemplate
python·langchain
东方不败之鸭梨的测试笔记1 天前
LangChain: Models, Prompts 模型和提示词
人工智能·python·langchain
AI Echoes1 天前
别再手工缝合API了!开源LLMOps神器LMForge,让你像搭积木一样玩转AI智能体!
人工智能·python·langchain·开源·agent
AI Echoes1 天前
从零构建企业级LLMOps平台:LMForge——支持多模型、可视化编排、知识库与安全审核的全栈解决方案
人工智能·python·langchain·开源·agent
beijingliushao1 天前
58-正则表达式
数据库·python·mysql·正则表达式
陈敬雷-充电了么-CEO兼CTO1 天前
具身智能多模态感知与场景理解:融合语言模型的多模态大模型
人工智能·python·gpt·语言模型·自然语言处理·chatgpt·多模态
荔枝吻1 天前
【AI总结】Python BERT 向量化入门指南
人工智能·python·bert