2

GoogleAppEngineサーバーからJSONコンテンツを提供しています。データを最後にロードしてから変更されたかどうかを知るために、コンテンツにETAGを提供する必要があります。次に、私のアプリは古いデータを削除し、新しいJSONデータを使用してビューにデータを入力します。

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

応答にETAGを設定するためのベストプラクティスは何ですか?ETAGを自分で計算する必要がありますか?それとも、HTTPプロトコルにこれを実行させる方法ですか?

4

2 に答える 2

4

e-tagの値は自分で計算する必要があります。Eタグは不透明な文字列であり、アプリケーションにとってのみ意味があります。

ベストプラクティスは、JSONコンテンツを決定するすべての入力変数(文字列に変換)を連結することです。変更された場合にJSON出力が変更されるものはすべて、これの一部である必要があります。これらの文字列に公開したくない機密情報がある場合は、代わりに値のMD5ハッシュを使用してください。

たとえば、私が管理しているCMSアプリケーションでは、フロントページに次の電子タグがあります。

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

気になる入力変数は|シンボルと連結されて不透明な値になりますが、最終的に変更されたタイムスタンプ(数値)、ブラウザーで受け入れられる言語ヘッダー、現在のビジュアルテーマなど、いくつかの異なる入力値を表します。ブラウザのCookieから取得される(フロントページのコンテンツが取得されるコンテキストを決定する)内部UID。これらの変数のいずれかが変更されると、ページが異なる可能性があり、キャッシュされたコピーが古くなります。

eタグは、すばやく確認する手段がないと役に立たないことに注意してください。クライアントはそれをIf-None-Matchリクエストヘッダーに含めます。サーバーは現在の変数からe-tagヘッダーをすばやく再計算し、タグがまだ最新であるかどうかを確認できる必要があります。その再計算にコンテンツ本文の再生成と同じ時間がかかる場合は、304 Not Modified応答の完全なJSON本文ではなく、応答を送信する帯域幅を少し節約するだけ200 OKです。

于 2012-11-14T11:19:10.220 に答える
4

webapp2を使用している場合は、応答本文に基づいてmd5ETagを自動的に追加できます。

self.response.md5_etag()

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

于 2012-11-14T12:41:14.440 に答える