2016-10-04 5 views
3

파이썬에서 'Session 클래스'요청을 통해 API를 친다. 내가 얻고있어 & 요청을 사용하여 POST 메서드 호출을 호출합니다. Session().Python : 객체의 메소드를 Monkeypatching

모든 통화 (GET/POST) 실패시 다른 프로세스에 알리고 싶습니다.

s = request.Session() 
def post(): 
    try: 
     s.post(URL,data,headers) 
    except: 
     notify_another_process() 

을 그리고 대신 직접 requests.Session().post의이 메서드를 호출 : 나는 다음과 같은 유틸리티 메소드를 작성하여이 작업을 수행 할 수 있습니다.

그러나이 코드를 requests.Session().post으로 monkeypatch하고 requests.Session().post 메서드 호출 자체에서 다른 프로세스에 알리는 추가 기능을 원합니다. 이것을 어떻게 할 수 있습니까?

편집 1 :

requests.Session()의 포스트 방법은 다음과 같은 서명이 있습니다

:

def post(self, url, data=None, json=None, **kwargs): 
    return self.request('POST', url, data=data, json=json, **kwargs) 

을 어떻게 든 다음과 같은 내 사용자 정의 포스트를 만들려고하는 경우

def post_new(self, url, data=None, json=None, **kwargs): 
    try: 
     s.post(url,data, json,kwargs) 
    except: 
     notify_another_process() 

다음과 같이 패치를 수행합니다

requests.post = post_new 

self을 사용하고 있지 않기 때문에 session.post 안에 session's object을 사용하고 있지 않기 때문에 이것은 실제로 좋은 monkeypatching이 아닙니다.

+0

가능한 복제 [한 원숭이는 파이썬에서 함수를 패치 않습니다 어떻게?] (http://stackoverflow.com/questions/2375403/how-does-one-monkey-patch-a-function-in- 파이썬) –

+0

['post' 메소드 서명이 게시 한 것과 다릅니다.] (https://github.com/kennethreitz/requests/blob/master/requests/api.py#L99) –

+0

@ ŁukaszRogalski 전 [세션 게시 방법] (https://github.com/kennethreitz/requests/blob/master/requests/sessions.py#L513)을 사용하려고합니다. –

답변

1

post_new하는 포스트 기능을 설정합니다. 그것은 Siddharth & lafferc 모두에 의해 언급 된 답변에서 영감을 얻었습니다. 이것은 둘 다 언급 한 것 위에 있습니다.

>>> import requests 
>>> def post(self, url, data=None, json=None, **kwargs): 
...  try: 
...   raise Exception() 
...  except: 
...   print "notifying another process" 
... 
>>> setattr(requests.Session, 'post_old', requests.Session.post) 
>>> setattr(requests.Session, 'post', post) 
>>> s = requests.Session() 
>>> s.post("url") 
notifying another process 
2

이렇게하면 해결됩니다. 기본적으로 이전 함수를 다른 이름으로 저장하고 함수를 기본 게시물로 제공합니다. 당신은 거의 다,하지만 당신은 자기 인수

def post_new(self, url, data=None, json=None, **kwargs): 
    try: 
     return self.request('POST', url, data=data, json=json, **kwargs) 
    except: 
     notify_another_process() 

를 사용해야합니다

setattr(requests, 'old_post', requests.post) 

def post(url, data=None, json=None, **kwargs): 
    try: 
     requests.old_post(url, data, json, kwargs) 
    except: 
     notify_another_process() 

setattr(requests, 'post', post) 
+0

질문을 업데이트했습니다. 나는 세션에 대해 언급하지 않았다. 또한, 귀하의 답변은 요청의 경우에 맞을지라도 나는 문제의 명확성을 위해 나와 미래 청중을위한 대답을 위해 저에게 도움이되는 답변을 게시 할 것입니다 (만약 누군가가 미래에 도움이된다면). 대답 해줘서 고마워. :) –

2

는 다음이 나를 위해 일한 답변입니다

requests.post = post_new 
+0

질문을 업데이트했습니다.나는 세션에 대해 언급하지 않았다. 또한, 귀하의 답변은 요청의 경우에 맞을지라도 나는 문제의 명확성을 위해 나와 미래 청중을위한 대답을 위해 저에게 도움이되는 답변을 게시 할 것입니다 (만약 누군가가 미래에 도움이된다면). –

+0

답변 해 주셔서 감사합니다. :) –

관련 문제