2013-07-09 2 views
2

파이썬 요청 모듈의 Documentation은 "콜백 함수가 값을 반환하면 전달 된 데이터를 대체한다고 가정합니다. '아무것도 반환하지, 그 밖의 아무 것도 영향을 미치지 않습니다.'파이썬 요청 hook은 예외를 발생시키는 값을 반환합니다.

이제 내 후크 함수에서 값 (int 값)을 반환하려고하는데 예외가 발생합니다. 반환 값이 DOESNOT에 raw() 메소드가 정의 된 객체 인 경우 모든 경우에 유효합니다. 여기

이 몇 가지 코드

def hook(resp,**kwargs): 
    print resp.url 
    return 1 

def main() 
    s = requests.Session() 
    s.hooks = {"response":hook} 
    r = s.get("http://localhost/index.html") 

입니다 그리고 여기에 예외 :

http://localhost/index.html 
Traceback (most recent call last): 
File "/home/talha/ws/test.py", line 85, in <module> 
    main() 
File "/home/talha/ws/test.py", line 72, in main 
    r = s.get("http://localhost/index.html") 
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 347, in get 
    return self.request('GET', url, **kwargs) 
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 335, in request 
    resp = self.send(prep, **send_kwargs) 
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 446, in send 
    extract_cookies_to_jar(self.cookies, request, r.raw) 
AttributeError: 'int' object has no attribute 'raw' 

sessions.py @line (446)의 코드는 dispatch_hook..From 소스

후 쿠키를 추출하기 위해 노력하고있다
# Response manipulation hooks 
    r = dispatch_hook('response', hooks, r, **kwargs) 

    # Persist cookies 
    extract_cookies_to_jar(self.cookies, request, r.raw) 

설명서를 변경해야하거나 취급을 다시해야합니다. . 이것을 처리하는 가장 좋은 방법은 무엇입니까?

내가베이스를 response 개체를 반환하려고 의견을 바탕으로 [업데이트]

. 필드의 일부가 None으로 초기화 되었기 때문에 이런 방식으로 사용할 수 없습니다.

최근 코드 :

def hook(resp, **kwargs): 
    obj = requests.Response() 
    return obj 

예외는 이제 던져 :

Traceback (most recent call last): 
File "/home/talha/ws/test.py", line 88, in <module> 
    main() 
File "/home/talha/ws/test.py", line 75, in main 
    r = s.get("http://localhost/index.html") 
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 347, in get 
    return self.request('GET', url, **kwargs) 
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 335, in request 
    resp = self.send(prep, **send_kwargs) 
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 446, in send 
    extract_cookies_to_jar(self.cookies, request, r.raw) 
File "/usr/lib/python2.7/site-packages/requests/cookies.py", line 108, in extract_cookies_to_jar 
    res = MockResponse(response._original_response.msg) 
AttributeError: 'NoneType' object has no attribute '_original_response' 

무엇 보인다 것은 내가 전체 의사의 응답을 구현해야한다는 것입니다?

+1

내 기대는 콜백이받는 것과 동일한 유형을 반환해야하므로 의도적으로 수정 된 "응답"을 반환합니다. 참고 : 저는 파이썬 요청 사용자가 아닙니다. 이것은 직관입니다. –

+1

아무런 문제가 없습니다. 당신은 응답 객체를받습니다. 그래서 당신이 반환하는 것은 그 응답 객체를 대체 할 것입니다. 코드의 나머지 부분은 여전히 ​​대체 객체가 응답 객체가 될 것으로 기대하며 실제로이를 명시해야합니다. –

답변

1

콜백 함수가 값을 반환하면 전달 된 데이터를 바꾸는 것으로 가정합니다. 함수가 아무것도 반환하지 않으면 그 밖의 작업이 수행되지 않습니다.

즉, 반환 한 모든 것은 전달 된 응답 개체의 위치를 ​​차지할 것으로 예상됩니다.

만 반환 할 수 있다고 설명서에 나와 있지 않습니다. 대신에 당신은 무엇을 기대 했습니까?

다른 데이터가 포함 된 응답을 반환하려면 응답과 같은 역할을하는 것을 반환하십시오. 이 중 하나는 requests 응답 객체를 서브 클래스 또는 동일한 API를 제공하는 것을 구현해야한다는 것을 의미 :

from requests.moduls import Response 

class MyIntResponse(Response): 
    def __init__(self, integer): 
     super(MyIntResponse, self).__init__() 
     self._content_consumed = True 
     self._content = integer 

def hook(resp,**kwargs): 
    print resp.url 
    newresp = MyIntResponse(1) 
    newresp.raw = resp.raw # copy across original HTTP response object 

당신은 원래의 응답에서 다른 속성의 일부를 복사 할 수 있습니다를, Response 객체의 속성에 대한 설명서를 확인하십시오.

+0

이 게시물에 더 추가되었습니다. – auny

+0

코드는'.raw'가 설정 될 것으로 기대합니다. –

+0

개선점은'_content'보다는'status_code'에서 정수를 설정하는 것입니다. 고마워 btw – auny

관련 문제