从命令行调用Python SimpleHTTPServer时禁用缓存选项

51

我在Windows 7上使用命令行

python -m SimpleHTTPServer 8888

为了进行开发,调用一个简单的Web服务器从目录中提供文件。

问题是该服务器似乎将文件缓存在内存中。即使有更新的文件可用,仍然提供旧版本的文件。

是否有办法直接从命令行指定“无缓存”选项?


2
你尝试过在浏览器中使用Ctrl+F5进行刷新吗?而不是使用F5? - zenpoy
我制作了一个现代的Python 3版本,基于最高投票答案:https://gist.github.com/opyate/6e5fcabc6f41474d248613c027373856 - opyate
5个回答

56

也许这会起作用。将以下内容保存到文件中:

serveit.py

#!/usr/bin/env python
import SimpleHTTPServer

class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_my_headers()
        SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)

    def send_my_headers(self):
        self.send_header("Cache-Control", "no-cache, no-store, must-revalidate")
        self.send_header("Pragma", "no-cache")
        self.send_header("Expires", "0")


if __name__ == '__main__':
    SimpleHTTPServer.test(HandlerClass=MyHTTPRequestHandler)

然后使用以下命令运行它

python serveit.py 8000

使用端口8000来服务于当前目录。这个方法是从这个代码片段中获取并且看起来非常可行!

注意:如果你只是想运行本地 web 服务器来服务于静态内容,那么你可能会对一个缓存的node解决方案http-server感兴趣,我一直在使用它,效果很棒。

另外,如果你使用的是Mac,如果以root身份运行它,你可以在80或443端口上运行它!例如:

sudo python serveit.py 80

就可以让你在浏览器中通过http://localhost来访问它。


2
е°Ҷд»ҘдёӢеҶ…е®№ж·»еҠ еҲ°.bash_profileдёӯеҸҜд»ҘдҪҝе…¶жӣҙеҠ ж–№дҫҝпјҡalias server="open http://localhost:8000/ && echo 'Starting server at localhost:8000' && python ~/serveit.py 8000 > /dev/null 2>&1" - Jörn Zaefferer
2
一个关于为什么这个方法有效的理论:SimpleHTTPRequestHandler只发送“Last-Modified”头信息,它不发送max-age或任何明确的信息来说明它的有效期,但浏览器默认会缓存一段启发式时间:https://dev59.com/-mUq5IYBdhLWcg3wbv_k,https://dev59.com/OWYq5IYBdhLWcg3woB0W#31852117,除非明确告知不要缓存(这里的“Cache-Control”就是起到了这个作用)。 - Beni Cherniavsky-Paskin
1
现代化的Python 3 -> https://gist.github.com/opyate/6e5fcabc6f41474d248613c027373856 - opyate
几乎了解,但您确实必须调用超级方法。 - mirabilos

37

当然,上面的脚本在Python 3.x下不起作用,但只需要将 SimpleHTTPServer 改为 http.server 就可以了,如下所示:

#!/usr/bin/env python3

import http.server

class MyHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_my_headers()
        http.server.SimpleHTTPRequestHandler.end_headers(self)

    def send_my_headers(self):
        self.send_header("Cache-Control", "no-cache, no-store, must-revalidate")
        self.send_header("Pragma", "no-cache")
        self.send_header("Expires", "0")


if __name__ == '__main__':
    http.server.test(HandlerClass=MyHTTPRequestHandler)

几乎了解了,但你真的必须调用超级方法。 - mirabilos

11

我建议您在刷新浏览器时按下Ctrl+F5。

刚刚遇到了这个,也许正是您正在寻找的东西(顺便说一句,它是用Ruby编写的)。


2
但是,但是,我正在使用jQuery AJAX。即使设置$.ajaxSetup({cache: false});也无法解决它。 - Synesso
1
有些人正在iPhone上的Safari中进行调试,那里没有相当于CTRL+F5的功能。 - yeoman

5
也许是浏览器缓存了你的文件,而不是SimpleHTTPServer。首先尝试停用浏览器缓存。

我通过尝试在Firefox而不是Chrome中加载页面,发现这对我来说是个问题。但是,我该如何在Chrome上解决这个问题呢? - nirvanaswap
这对我在Firefox中有效:清空Firefox浏览器缓存(版本4至67):按下Ctrl + Shift + Del键。一个新窗口将打开。激活“缓存”选项,然后单击“立即删除”。 - jbiWeisendorf

1
我更改了另一个端口号,更新的文件在我的浏览器上反映出来。
例:
python -m http.server -p 8000

python -m http.server -p 8001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接