6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonの簡易HTTPサーバでブラウザキャッシュを無効にするには

Posted at

簡易HTTPサーバ http.server

ローカルにあるHTMLファイルにブラウザからアクセスするための簡易的なHTTPサーバは、Pythonがあれば以下のコマンドで起動できます。

$ python -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

このコマンドを実行し、同じPCのブラウザで http://localhost:8080/ にアクセスすれば、カレントディレクトリにある index.html が表示されます。

困ったこと

ブラウザにキャッシュが効いてリロードしてもブラウザが簡易HTTPサーバにリクエストしてくれないときがあり、ローカルファイルを編集してもブラウザで確認できなくて困るケースがありました。ブラウザからキャッシュを消せばいいのですが、手間です。

そこで、簡易HTTPサーバからのレスポンスにキャッシュの有効期限0を含めるようにしました。

キャッシュ無効のPythonスクリプト

import http.server
import sys

port = int(sys.argv[1])

class NoCacheHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_header('Cache-Control', 'max-age=0')
        self.send_header('Expires', '0')
        super().end_headers()

httpServer = http.server.HTTPServer(('', port), NoCacheHTTPRequestHandler)
httpServer.serve_forever()

server.py などの名前でこのスクリプトを保存すると、以下のコマンドでサーバが起動します。

$ python server.py 8080

レスポンスヘッダはcurlコマンドでも確認できます。別のターミナルを開いて実行します。

$ curl -I http://localhost:8080/
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.8.3
Date: Thu, 12 Nov 2020 13:31:44 GMT
Content-type: text/html
Content-Length: 1178
Last-Modified: Thu, 12 Nov 2020 13:21:38 GMT
Cache-Control: max-age=0
Expires: 0

ブラウザでも毎回リクエストを送信してくれるようになり、ローカルファイルの変更がすぐに反映されるようになりました。

バージョン情報

$ python --version
Python 3.8.3
6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?