MST

星途 面试题库

面试题:Python实现带认证的HTTP请求及优化

假设目标服务器需要Basic认证(用户名:user,密码:pass),使用Python编写代码发送一个HTTP GET请求到该服务器指定接口(例如http://protected.example.com/data )。同时,考虑到性能优化,如何设置合适的连接池大小和超时时间以提高请求效率?请给出详细代码和解释。
11.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
import ssl


# 自定义SSL上下文,解决可能的SSL验证问题
class CustomHttpAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(
            num_pools=connections,
            maxsize=maxsize,
            block=block,
            ssl_version=ssl.PROTOCOL_TLSv1_2
        )


# 创建会话对象
session = requests.Session()
# 设置连接池大小,connections表示最大的连接数,maxsize表示每个连接池的最大连接数
adapter = CustomHttpAdapter(connections=10, maxsize=10)
session.mount('http://', adapter)
session.mount('https://', adapter)

# 设置Basic认证信息
auth = ('user', 'pass')
# 设置超时时间,单位为秒,这里设置连接超时为5秒,读取超时为10秒
timeout = (5, 10)

try:
    response = session.get('http://protected.example.com/data', auth=auth, timeout=timeout)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"请求发生异常: {e}")

代码解释

  1. 自定义SSL上下文
    • CustomHttpAdapter类继承自HTTPAdapter,重写了init_poolmanager方法,用于设置特定的SSL版本(PROTOCOL_TLSv1_2),以解决可能的SSL验证问题。这在一些老版本的服务器或特定网络环境中可能会用到。
  2. 连接池设置
    • 创建CustomHttpAdapter对象adapter,并设置connections为10,表示最大的连接数为10;maxsize也为10,表示每个连接池的最大连接数为10。这样可以在并发请求时复用连接,提高性能。
    • 使用session.mount方法将这个适配器挂载到http://https://协议上,使得会话对象session在发送请求时使用我们设置好的连接池。
  3. Basic认证
    • 使用元组('user', 'pass')设置auth变量,在session.get请求中传递auth参数,实现Basic认证。
  4. 超时时间设置
    • timeout变量设置为一个元组(5, 10),第一个值5表示连接超时时间为5秒,第二个值10表示读取超时时间为10秒。这样可以避免请求长时间等待,提高请求效率。如果在指定时间内连接不上服务器或无法读取响应数据,会抛出相应的异常。
  5. 异常处理
    • 使用try - except块捕获requests.exceptions.RequestException异常,打印出请求过程中发生的异常信息,确保程序的健壮性。