Tag/REST
キャッシュ関連のヘッダメモ
なんとなくで通り過ぎてたのを調べてみたメモ。 知ってたのも知らなかったのも、恥を晒すためにもブログに書いておく。
リクエストヘッダ
- If-Modified-Since
日時を指定し、それより新しいコンテンツの場合にのみデータを返すようにサーバにリクエストする。
Ajaxでのキャッシュ抑制のために以下の設定で頻繁に使ってるな。
If-Modified-Since: Thu, 01 Jan 1970 00:00:00 GMT
この使い方が合ってるのかは分からんですけども、 QueryStringに時間をくっつけてキャッシュから逃げるやり方よりかは、 こっちの方がスマートで好き。
- If-None-Match
エンティティタグを指定し、一致しない場合にのみデータを返すようにサーバにリクエストする。
If-None-Match: "xyzzy"
とか
If-None-Match: *
とか指定するらしい。意図的に付ける場面はまだ思いつかないなぁ。
レスポンスヘッダ
- Expires
- コンテンツの有効期限を指定する。
- Last-Modified
- コンテンツの最終更新時刻を指定する。 If-Modified-Since と対で使用される。
- ETag
コンテンツを特定するための固有値を指定する。 If-None-Match と対で使用される。
Proxyとか使ってる場合にコイツが悪さをする事があるらしい。 その場合、設定を変えてやる必要がある。デフォルトだと以下になってる。
# デフォルトだとi-node, 最終変更時刻, ファイルサイズを見る。 FileETag INode MTime Size
i-nodeなどが邪魔してる場合は INode を外してやる。
# 最終変更時刻, ファイルサイズを見る。(i-nodeは見ない。) FileETag MTime Size
Directory, VirtualHost なディレクティブでも指定出来る。詳しくは core - Apache HTTP サーバ の FileETag を見る。
共通ヘッダ
- Cache-Control
- そのまま。キャッシュコントロールに関する指定をする。 HTTP/1.1から追加されたらしい。詳しい情報は HTTP/1.1: Header Field Definitions の 14.9 Cache-Control を見る。
- Pragma
- 特殊な追加情報を指定する。これはHTTP/1.0からある。 no-cache を指定することも出来る。詳しい情報は HTTP/1.1: Header Field Definitions の 14.32 Pragma を見る。
まとめ
眠気と戦いながら、調べながらメモしたので全然まとまってないや。
でも、忘れた時に見るべき場所は分かったので、それだけで良しとする。
また理解出来た頃にちゃんとまとめようと思う ![]()
- Posted at:
- 2008/05/01 02:26:03
- 0 Comments
- 0 TrackBacks
- Trackback:
- http://humming.via-kitchen.com/2008/05/01/cache-control-headers/trackback/
DjangoでPUTやDELETEやってみたメモ
Django でリクエストをPUTとかDELETEで投げる時に、 ちょろっとハマったのでメモ。
jQuery や Flash からPUTやDELETEでリクエストすると、 メソッド自体はちゃんと解釈されるものの、 なぜか渡したデータが取れなかった。 Pylons ではハマらなかったのになぁ。
で、そもそもデータが渡されてるのかを確かめるために、 Requestのraw_post_dataをプリントしてみると、 そこにはちゃんと入ってた。 データの受け渡し自体はちゃんと出来てるらしい。
じゃあ、次はどこでパースしてるか?って事で、 django.core.handlers.wsgi.py を追いかけてみる。
どうやら111行目あたり、 WSGIRequest のメソッドの _load_post_and_files がパースしてるみたいなのですが、 ここで原因を発見。
def _load_post_and_files(self):
# Populates self._post and self._files
if self.method == 'POST': #<-- ココ
if self.environ.get('CONTENT_TYPE', '').startswith('multipart'):
header_dict = dict([(k, v) for k, v in self.environ.items() if k.startswith('HTTP_')])
header_dict['Content-Type'] = self.environ.get('CONTENT_TYPE', '')
self._post, self._files = http.parse_file_upload(header_dict, self.raw_post_data)
else:
self._post, self._files = http.QueryDict(self.raw_post_data, encoding=self._encoding), datastructures.MultiValueDict()
else:
self._post, self._files = http.QueryDict('', encoding=self._encoding), datastructures.MultiValueDict()
どうやらPOSTじゃないとリクエストされたデータをパースしないらしいよ。困った。
django.core.handlers.modpython.py も見てみると、 こちらはContent-Typeのみを見て判別してるみたい。
とりあえず、POSTしか受け付けないのはツライので、 PUTとDELETEも追加して対処する事に。
Index: django/core/handlers/wsgi.py
===================================================================
--- django/core/handlers/wsgi.py (revision 6708)
+++ django/core/handlers/wsgi.py (working copy)
@@ -110,7 +110,7 @@
def _load_post_and_files(self):
# Populates self._post and self._files
- if self.method == 'POST':
+ if self.method in ('POST', 'PUT', 'DELETE'):
if self.environ.get('CONTENT_TYPE', '').startswith('multipart'):
header_dict = dict([(k, v) for k, v in self.environ.items() if k.startswith('HTTP_')])
header_dict['Content-Type'] = self.environ.get('CONTENT_TYPE', '')
とりあえず、コレでPUTやDELETEのデータもちゃんと受け取れるようになったよ。 果たして良いのかどうかは分からんですけども。
これでしばらく様子を見てみよう。
- Posted at:
- 2007/11/26 23:17:49
- 2 Comments
- 1 TrackBack
- Trackback:
- http://humming.via-kitchen.com/2007/11/26/tried-put-and-delete-on-django/trackback/