【问题标题】:Remove cache in a python HTTP server删除 python HTTP 服务器中的缓存
【发布时间】:2017-02-20 09:40:29
【问题描述】:

我在网上找到了这个服务器,并对其进行了一些编辑。 代码如下:

from http.server import BaseHTTPRequestHandler, HTTPServer
from xml.dom import minidom
import os


class MyHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        self.data_string = self.rfile.read(int(self.headers['Content-Length']))
        self.send_response(200)
        self.end_headers()
        valore = str(self.data_string)[2:-1]
        response = ["",""]
        response[0],response[1] = processData(valore)
        if response[0] == 1:
            sep = ""
            message = ""
            for res in response[1]:
                message += res
            response = sep.join(message)
            self.wfile.write(bytes(message, "utf-8"))

    def do_GET(self):
        # Send response status code
        self.send_response(200)
        # Send headers
        if self.path.endswith("html"):
            self.send_header('Content-type', 'text/html')
            self.end_headers()
        elif self.path.endswith("css"):
            self.send_header('Content-type', 'text/css')
            self.end_headers()
        elif self.path.endswith("js"):
            self.send_header('Content-type', 'application/javascript')
            self.end_headers()
        elif self.path.endswith(".ico"):
            print(self.rawpath)
        if not self.path.endswith("jpeg") and not self.path.endswith("jpg") and not self.path.endswith("png") and not self.path.endswith("gif"):
            with open(self.path[1:], 'r') as myfile:
                data = myfile.read()
            # Write content as utf-8 data
            self.wfile.write(bytes(data, "utf8"))
        if self.path.endswith("jpeg"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/jpeg')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        elif self.path.endswith("png"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/png')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        elif self.path.endswith("gif"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/gif')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        elif self.path.endswith("jpg"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/jpeg')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        return

def run():
    print('starting server...')

    # Server settings
    # Choose port 8080, for port 80, which is normally used for a http server, you need root access
    server_address = ('192.168.2.245', 8081)
    httpd = HTTPServer(server_address, MyHandler)
    print('running server...')
    httpd.serve_forever()


def processData(data):
    XMLlist = []
    data = data.split(":")
    if data[0] == "XMLlist":
        path = os.path.realpath(__file__)
        path = os.path.dirname(path)
        for filename in os.listdir(path):
            if filename.endswith('.xml'):
                XMLlist.append(filename[:-3])
        return 1,XMLlist
                #fullname = os.path.join(path, filename)
    else:
        file = open('default.xml', 'r')
        tree = minidom.parse(file)
        tree.getElementsByTagName(data[0])[0].childNodes[0].replaceWholeText(data[1])
        file = open('default.xml', 'w')
        tree.writexml(file)
        file.close()
        return 0, 1


run()

服务器工作正常,我需要删除缓存。当我尝试从同名的 html 页面刷新图像时,服务器将缓存的图像返回给我...您有什么建议吗?

谢谢你,对不起我的英语......

【问题讨论】:

    标签: python caching server basehttpserver


    【解决方案1】:

    http.server 不发送“no cache”头,所以我们需要发送“no cache”头

    # NoCacheHTTPServer.py
    
    import http.server
    
    PORT = 8000
    
    class NoCacheHTTPRequestHandler(
        http.server.SimpleHTTPRequestHandler
    ):
        def send_response_only(self, code, message=None):
            super().send_response_only(code, message)
            self.send_header('Cache-Control', 'no-store, must-revalidate')
            self.send_header('Expires', '0')
    
    if __name__ == '__main__':
        http.server.test(
            HandlerClass=NoCacheHTTPRequestHandler,
            port=PORT
        )
    

    在 CLI 中运行

    python NoCacheHTTPServer.py
    

    【讨论】:

      【解决方案2】:

      尝试按 Ctrl+F5 或 Shift+F5

      刷新浏览器

      【讨论】:

      • 是的,但这不会禁用服务器的缓存...我希望服务器不存储任何缓存...这可能吗?
      • self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0')
      • 它会阻止缓存,我认为python不会缓存文件..您是否尝试过刷新服务器?
      • 是的,我每次更改都会刷新服务器。也许我错了,这不是服务器问题。我告诉图像用另一个具有相同名称的图像刷新自己,即使源图像发生更改,图像仍然相同。
      • 我解决了这个问题。那是浏览器。我正在使用禁用 chaced 的 Firefox。我尝试使用 Chrome,一切正常!很抱歉占用您的时间,谢谢您的帮助!
      猜你喜欢
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2018-10-30
      • 1970-01-01
      • 2016-06-13
      • 2015-08-30
      • 1970-01-01
      相关资源
      最近更新 更多