2017-05-17 1 views
0

이런 문제가 있습니까? 요청 모듈에서 세션 사용하기 im python 세션은 첫 번째 요청만으로 인증을 전송합니다. 왜 이런 일이 일어 났습니까?파이썬에서 세션 인증

{'Authorization': 'Basic auth_data', 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.12.3'} 

을하지만 난 동일 여부 같은 URL을 사용하여 다음 요청을 보내는 경우 : 내가이 응답 요청 헤더를 찾는 경우

import requests 
session = requests.Session() 
session.auth = (u'user', 'test') 
session.verify = False 
response = session.get(url='https://my_url/rest/api/1.0/users') 

내가 볼

response = session.get(url='https://my_url/rest/api/1.0/users') 

나는 것을 볼 수 있습니다 요청시 승인 헤더가없는 곳 :

print response.request.headers 
{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.12.3'} 

그리고 나는 그것 때문에 401 반응을 얻는다.

왜 그렇습니까? 세션은 그것을 사용하여 만들어진 모든 요청에 ​​대해 인증을 보내야합니까? 세션을 사용하여 모든 요청에 ​​대해 인증 데이터를 보내려면 어떻게해야합니까? 나는 당신의 의견에 정확한 코드가 Authorization 헤더는 처음print에서 누락되어 있음을 실행할 때 내가 볼, 아직이 에 존재하는 어떤

+0

맞습니다. 제대로 작동합니다. 'session = requests.Session()'을 다시 호출하지 않거나, 그렇지 않으면'session.auth'를 다시 설정 하시겠습니까? – mhawke

+0

totaly, 당신은 헤더를 볼이 코드를 실행하려고 자신 '가져 오기 요청 세션 = requests.Session() session.auth = (u'x-의 OAuth 토큰 ','테스트 ') session.verify = 거짓 응답 = session.get (url = 'https : //test.com') 응답 response.request.headers 응답 = session.get (url = 'https : //test.com') 응답 response.request. 헤더 ' – Vova

답변

2

. 이것은 당신이보고하는 문제의 반대편 인 것 같습니다.

이것은 첫 번째 요청이 301 응답에 의해 리디렉션되고 auth 헤더가 리디렉션 된 위치에 대한 후속 요청에 전파되지 않는다는 사실에 의해 설명됩니다. auth 헤더가 response.history[0].request.headers을보고 초기 요청에서 전송되었음을 알 수 있습니다.

세션이 호스트에 대한 연결을 열린 상태로 유지 했으므로 (Connection: keep-alive 헤더로 인해) 두 번째 요청이 리디렉션되지 않으므로 print response.request.headers 일 때 인증 헤더가 나타납니다.

나는 실제적으로 https://test.com을 사용하고 있을지는 모르지만 사용중인 서버에서 비슷한 일이 벌어지고있는 것 같습니다.

테스트를 위해 매우 편리한 공용 테스트 HTTP 서버 https://httpbin.org/headers을 사용하는 것이 좋습니다. 그러면 응답 본문에서 서버가 수신 한 헤더가 반환됩니다. 리디렉션 URL 중 하나를 사용하여 리디렉션 된 요청을 테스트 할 수 있습니다.

+0

이 문제를 해결합니다. 인증이 리디렉션 때문에 전송되지 않았기 때문에 리디렉션 리드에서 호스트를 변경하고 세션이 모든 요청에서 인증을 보내기 시작합니다. – Vova