首页 > 解决方案 > 在一个中心位置全局修改请求

问题描述

我的任务是更新现有的 Python 模块,该模块使用requests. 也就是说,在这个模块中,至少有 50 种用法requests来向所述 API 发送请求。

API 发生了变化,要求将标头添加到所有请求中。在手动将标头添加到所有 50 个请求之前,我想知道是否可以定义某种“中间件”(例如在Django中),它可以一次为所有请求添加标头。

这样的事情可能requests吗?

标签: pythonpython-requests

解决方案


您可以使用包装器对函数进行猴子修补,该包装器使用附加条目requests.request更新由参数指定的字典。headers

下面是一个示例,它将强制所有请求的标头User-Agent具有 value My Browser

import requests
import inspect

def override_headers(self, func, global_headers):
    def wrapper(*args, **kwargs):
        bound = sig.bind(*args, **kwargs)
        bound.apply_defaults()
        bound.arguments.setdefault('headers', {}).update(global_headers)
        return func(*bound.args, **bound.kwargs)

    sig = inspect.signature(func)
    return wrapper

requests.request = override_headers(requests.request, {'User-Agent': 'My Browser'})

推荐阅读