Python 如何在请求中重写.get()方法?
我希望Python 如何在请求中重写.get()方法?,python,overriding,python-requests,Python,Overriding,Python Requests,我希望requests中的.get()方法在get本身之外执行额外的操作: 打印出“hello world”(实际上这将是日志记录) 等待5秒钟,然后发出实际的GET(实际上,这将是一个更复杂的等待重试操作) 现在,我最简单的解决方案是使用一个实际调用requests.get()的函数: 但是我有一种强烈的感觉,那就是可以重写请求中的实际.get()方法 我以一种非常基本的方式使用对象编程,这将是一个实际学习覆盖部分的机会。关于如何重写和调用父类方法(这正是我想要做的:最终能够使用原始的.g
requests
中的.get()
方法在get
本身之外执行额外的操作:
- 打印出“hello world”(实际上这将是日志记录)
- 等待5秒钟,然后发出实际的
(实际上,这将是一个更复杂的等待重试操作)GET
requests.get()
的函数:
但是我有一种强烈的感觉,那就是可以重写请求中的实际.get()
方法
我以一种非常基本的方式使用对象编程,这将是一个实际学习覆盖部分的机会。关于如何重写和调用父类方法(这正是我想要做的:最终能够使用原始的.get()
方法)有很多讨论
因此,我尝试了一种基本的覆盖:
import requests
class MyRequest(requests.Request):
def get(self, url, **kwargs):
print("hello world")
# calling the parent .get() method to actually GET something
super(MyRequest, self).get(url, **kwargs)
r = MyRequest.get('http://google.com')
此代码在以下情况下失败:
Traceback (most recent call last):
File "C:/Users/yop/dev/infoscreen/testingrequestsclass.py", line 8, in <module>
r = MyRequest.get('http://google.com')
TypeError: get() missing 1 required positional argument: 'url'
回溯(最近一次呼叫最后一次):
文件“C:/Users/yop/dev/infoscreen/testingrequestsclass.py”,第8行,在
r=MyRequest.get('http://google.com')
TypeError:get()缺少1个必需的位置参数:“url”
老实说,我被困在这里了。这些教程都是从父类的定义开始的,而我所拥有的是隐藏的(有),您可以覆盖它。它不是请求上的方法。请求模型:
import requests.api
def my_get(url, **kwargs):
print('Hello World!')
kwargs.setdefault('allow_redirects', True)
return requests.api.request('get', url, **kwargs)
requests.api.get = my_get
然后使用一个新的会话对象来处理请求
与其替换requests.get()
,我将提供requests.Session()
对象的子类,覆盖,然后使用该会话对象的实例:
from requests import Session
class MySession(Session):
def request(self, method, url, **kwargs):
print('Hello World!')
return super().request(method, url, **kwargs)
然后像这样使用:
with MySession() as session:
response = session.get(url)
这样做的好处是,您还可以利用会话对象提供的完整功能集,另外,您的附加代码还可以用于POST、PUT、DELETE和HEAD等请求。这是一个非常清楚的答案,谢谢。我将采用第二种方法,这种方法确实更加完整。然而,我得到了一个AttributeError:'MySession'对象在运行它(在google.com上)时没有属性“decode”
错误,作为调用out=string.decode(encoding)
的结果,在'File“C:\Python34\lib\site packages\requests\utils.py”,第690行,在to_native_string`.@WoJ:对不起,我的错误;我传入了self
作为super()
调用的第一个参数。现在删除。谢谢。如果有人到了那里,Python 2的调用将是super()
调用super(MySession,self)。request(method,url,**kwargs)
@WoJ:对,我假设您使用Python 3是因为您使用了print()
作为函数。是的,我使用print()
作为函数(并且系统地.format())
(带命名参数),因为我觉得这更自然(可能是Python 3发生变化的原因之一)
with MySession() as session:
response = session.get(url)