2010-02-19 2 views
0

내 하위 클래스 인 BaseHTTPRequestHandler에서 클라이언트가 보낸 쿠키를 "검색"합니다.Python을 사용하는 쿠키와 HTTP

은 첫째로 나는이 이벤트의 순서에 대한 이해입니다 전형적인 HTTP 요청 및 응답 헤더의 전송의 정확한 순서 확실 해요 :

  1. 클라이언트는 방법, 경로, HTTP (요청을 보냅니다 버전, 호스트 및 모든 헤더).
  2. 서버는 응답 코드로 응답하고 그 뒤에 일련의 자체 헤더가옵니다.
  3. 그런 다음 서버는 응답 본문을 보냅니다.

정확히 클라이언트의 POST 데이터가 전송됩니까? 위에서 설명한대로이 시퀀스에서 중복이 발생합니까?

둘째로, "쿠키"헤더가 서버에 수신되었다고 가정하는 것이 안전한 경우는 언제입니까? 서버에 의해 호출 된 self.send_response 때까지 모든 클라이언트 헤더를 수신해야합니까? HTTP 통신에서 쿠키 헤더를 들여다 볼 적절한 시간은 self.headers일까요?

세 번째로, 입니다. 파이썬에서 쿠키를 구문 분석하는 표준 방법입니다. 나는 현재 Cookie.SimpleCookie을 인스턴스화해야한다고 생각하고 쿠키 헤더의 데이터를 어떻게 받아 들여야하는지 생각한다. HTTPRequestHandler 인터페이스를 다룰 때 Cookie 클래스가 clunky가됩니다. 마지막으로, Cookie 모듈에서 쿠키 클래스, 그들은 '하는 환상을주는 이유는 줄 끝으로 끝나지 Cookie.output()의 출력은 self.wfile.write(cookie.output())에 맞지 않거나, 대신 self.send_header("Set-Cookie", cookie.output())

에 잘 맞도록 암시 적으로 제공 헤더 이름을 드롭 사전의 사전. 쿠키의 다른 키에 할당하면 더 많은 데이터가 쿠키에 저장되지 않고 오히려 더 많은 쿠키가 생성됩니다. 모든 쿠키는 분명히 한 클래스에 있고 각 쿠키는 자체 Set-Cookie 헤더를 생성합니다. 가치 컨테이너를 쿠키로 포장하는 가장 좋은 방법은 무엇입니까?

답변

2

HTTP는 중복이없는 요청/응답 프로토콜입니다. POST의 본문은 요청의 일부로 제공됩니다 (동사가 POST 일 때). 어떤 (브라우저가 쿠키를 비활성화 실행 또는 무엇 예를 들면 때, 물론 그런 헤더가 없을 수도 있습니다) 경우

모든 헤더는 Cookie:포함하여 요청의 일부로 제공됩니다. 요청을 받았을 때마다 머리글을 들여다보고 있습니다.

귀하의 "셋째"문제가 무엇인지 잘 모르겠습니다. 쿠키에 포함되지 않은 새 줄은 삽입되지 않습니다. 왜 그럴까요? 을 편집하십시오. 나중에 참조하십시오.

네 번째 요점은 쿠키를 "morsels"와 혼동하는 것일 수 있습니다. HTTP 응답에 Set-Cookie 헤더의 수에는 제한이 없으므로 그 이유는 무엇입니까?

편집 : 당신은 선택적으로 세 개의 인수까지 output에 전달할 수 있습니다 : 음식물의 세트 (기본을 None 의미 모든 속성) 각 음식물의 출력에서 ​​원하는, 당신의 앞에 사용할 헤더 문자열 속성 각 모음 (기본값은 Set-Cookie:), 원하는 모음 문자열 (기본값은 \r\n)입니다.그래서 쿠키의 사용 목적은 단일 음식물은 것 같다 (그렇지 않으면 당신은 당신이 가장 치열한 표시 하나의 헤더로 문자열 표현을 붙이지 수) :이 경우

thecookie.output(None, '') 

에 줄 것이다 당신은 당신이 원하는 문자열을 정확하게 입력하십시오. 하나의 꼬리가 각각 하나의 꼬리표에 들어 맞으므로 하나의 꼬리가있는 복수의 SimpleCookie 인스턴스를 만드십시오.

+0

세 번째 : 쿠키를 사용자에게 다시 보낼 수있는 "깔끔한"방법은 없습니다. 설명 된 바와 같이 쿠키는 수동으로 첨부 된 암시 적 헤더 또는 '\ r \ n'을 수동으로 도용 한 다음 쿠키가 분명히 헤더 임에도 불구하고 self.wfile에 수동으로 _written_합니다. –

+0

@Matt , 내가 명확하게 A를 편집하자. –

0

제 3 자 라이브러리가없는 쿠키를 빠르게 얻을 수 있습니다. 그것은 질문의 한 부분에만 대답하는 반면, 대부분의 "방문자"가 뒤따라 오는 질문에 대답 할 수 있습니다.

import Cookie 

def do_GET(self): 
    #----------------------------------------------- 
    cookies = {} 
    cookies_string = self.headers.get('Cookie') 
    if cookies_string: 
     cookies = Cookie.SimpleCookie() 
     cookies.load(cookies_string) 
    #----------------------------------------------- 
    if 'my-cookie' in cookies: 
     print cookies['my-cookie'].value 
    #----------------------------------------------- 
관련 문제