2012-11-14 2 views
2

Google App Engine 서버에서 일부 JSON 콘텐츠를 제공하고 있습니다. 나는 내가 마지막으로 데이터를로드 한 이후에 변경된 내용을 알기 위해 ETAG를 제공해야합니다. 그런 다음 내 응용 프로그램은 이전 데이터를 제거하고 새로운 JSON 데이터를 사용하여 뷰를 채 웁니다.Python 용 Google App Engine에서 ETAGS를 설정하는 방법은 무엇입니까?

self.response.headers['Content-Type'] = "application/json; charset=utf-8" 
    self.response.out.write(json.dumps(to_dict(objects,"content"))) 

응답에 대해 ETAG를 설정하는 것이 가장 좋은 방법은 무엇입니까? ETAG를 직접 계산해야합니까? 아니면 HTTP 프로토콜로이 작업을 수행 할 수 있습니까?

답변

4

webapp2를 사용하는 경우 자동으로 응답 본문을 기반으로하는 md5 ETag를 추가 할 수 있습니다.

self.response.md5_etag() 

http://webapp-improved.appspot.com/guide/response.html

+5

그런 전자 태그는 본질적으로 쓸모가 없습니다. 다시 응답 몸체를 다시 계산하여 다시 계산해야하기 때문입니다.전자 태그의 목적은 응답이 아직 신선한지를 확인하는 것입니다. –

+3

@MartijnPieters 응답 재생성의 필요성을 제거하는 것은 유용하지만 서버에서 클라이언트로 보내는 데이터를 줄이는 것도 가능합니다. 매우 중요한 영향을 미칩니다. –

4

직접 전자 태그 값을 계산해야합니다. 전자 태그는 응용 프로그램에만 의미가있는 불투명 한 문자열입니다.

JSON 콘텐츠를 결정하는 모든 입력 변수 (문자열로 변환)를 연결하는 것이 가장 좋습니다. 변경된 경우 JSON 출력이 변경 될 수있는 사항은이 중 일부 여야합니다. 노출되는 것을 원하지 않는 문자열에 민감한 것이 있으면 값 대신 MD5 해시를 사용하십시오. 예를 들어

내가 관리 CMS는 애플리케이션에서, 첫 페이지는 다음의 전자 태그를 가지고

|531337735|en-us;en;q=0.5|0|Eli Visual Theme|1|943ed3c25e6d44497deb3fe274f98a96|| 

우리 불투명 값으로 | 기호와 연결되어 관심있는 입력 변수 마지막으로 수정 한 시간 소인 (숫자), 브라우저에서 허용하는 언어 헤더, 현재 시각적 테마 및 브라우저 쿠키에서 검색된 내부 UID와 같은 몇 가지 고유 한 입력 값을 나타냅니다. 첫 페이지의 내용을 가져옵니다). 이러한 변수 중 하나라도 변경되면 페이지가 달라질 수 있으며 캐시 된 복사본은 오래 될 수 있습니다.

전자 태그는이를 신속히 확인할 수단이 없으면 쓸모가 없다는 점에 유의하십시오. 클라이언트는 요청 헤더에 If-None-Match 요청을 포함 시키며, 서버는 현재 변수에서 전자 태그 헤더를 신속하게 재 계산하고 태그가 여전히 최신 상태인지 확인할 수 있어야합니다. 재 계산이 콘텐츠 본문을 재생성하는 것과 동일한 시간이 걸리는 경우 전체 012ONB 형식의 콘텐츠 대신 304 Not Modified 응답을 보내는 작은 대역폭 만 저장하면 200 OK 응답이됩니다.

+0

'm = md5.new()의 json_dumps의 json.dumps = (helpers.to_dict (객체 "콘텐츠")) m.update (json_dumps) self.response.headersself.response.headers [ 'ETag'] = m.digest() self.response.out.write (json_dumps) ' – hakonbogen

+1

@'응용 프로그램/json, charset = utf- Hakonbogen : 이제 귀하의 e- 태그는 귀하의 응답만큼 비싸고 귀하는 그 목적을 이겼습니다. –

+0

나는 ETag를 사용하여 디스크에 저장된 데이터를 변경해야하는지 확인하므로 서버에 대한 비용이 중요하지 않습니다. – hakonbogen

관련 문제