【问题标题】:How can I let browser cache static files?如何让浏览器缓存静态文件?
【发布时间】:2014-06-19 10:58:58
【问题描述】:

最近我用web.py构建我的应用,发现我的静态文件在每个请求中都被传输了。

以下是我的日志:

10.18.40.100:49458 - - [19/Jun/2014 17:03:45] "HTTP/1.1 GET /css/bootstrap.css" - 200 OK
10.18.40.100:49459 - - [19/Jun/2014 17:03:45] "HTTP/1.1 GET /css/bootstrap-responsive.css" - 200 OK
10.18.40.100:49460 - - [19/Jun/2014 17:03:45] "HTTP/1.1 GET /js/jquery-1.8.2.min.js" - 200 OK
10.18.40.100:49461 - - [19/Jun/2014 17:03:45] "HTTP/1.1 GET /js/bootstrap.js" - 200 OK
10.18.40.100:49461 - - [19/Jun/2014 17:03:45] "HTTP/1.1 GET /img/mini.png" - 200 OK
10.18.40.100:49460 - - [19/Jun/2014 17:03:45] "HTTP/1.1 GET /img/test_mini.png" - 200 OK
10.18.40.100:49460 - - [19/Jun/2014 17:03:45] "HTTP/1.1 GET /favicon.ico" - 200 OK
10.18.40.100:49460 - - [19/Jun/2014 17:03:52] "HTTP/1.1 GET /compeval" - 200 OK
10.18.40.100:49460 - - [19/Jun/2014 17:03:52] "HTTP/1.1 GET /css/bootstrap.css" - 200 OK
10.18.40.100:49458 - - [19/Jun/2014 17:03:52] "HTTP/1.1 GET /js/bootstrap.js" - 200 OK
10.18.40.100:49459 - - [19/Jun/2014 17:03:52] "HTTP/1.1 GET /js/jquery-1.8.2.min.js" - 200 OK
10.18.40.100:49461 - - [19/Jun/2014 17:03:52] "HTTP/1.1 GET /css/bootstrap-responsive.css" - 200 OK
10.18.40.100:49459 - - [19/Jun/2014 17:03:53] "HTTP/1.1 GET /img/mini.png" - 200 OK
10.18.40.100:49459 - - [19/Jun/2014 17:03:53] "HTTP/1.1 GET /img/glyphicons-halflings.png" - 200 OK
10.18.40.100:49459 - - [19/Jun/2014 17:03:53] "HTTP/1.1 GET /favicon.ico" - 200 OK
10.18.40.100:49459 - - [19/Jun/2014 17:03:58] "HTTP/1.1 GET /viewcompqlab" - 200 OK
10.18.40.100:49459 - - [19/Jun/2014 17:03:58] "HTTP/1.1 GET /css/bootstrap.css" - 200 OK
10.18.40.100:49461 - - [19/Jun/2014 17:03:58] "HTTP/1.1 GET /css/bootstrap-responsive.css" - 200 OK
10.18.40.100:49460 - - [19/Jun/2014 17:03:58] "HTTP/1.1 GET /js/bootstrap.js" - 200 OK
10.18.40.100:49458 - - [19/Jun/2014 17:03:58] "HTTP/1.1 GET /js/jquery-1.8.2.min.js" - 200 OK
10.18.40.100:49458 - - [19/Jun/2014 17:03:58] "HTTP/1.1 GET /img/mini.png" - 200 OK
10.18.40.100:49458 - - [19/Jun/2014 17:03:58] "HTTP/1.1 GET /favicon.ico" - 200 OK
10.18.40.100:49517 - - [19/Jun/2014 17:07:05] "HTTP/1.1 GET /compeval" - 200 OK
10.18.40.100:49517 - - [19/Jun/2014 17:07:05] "HTTP/1.1 GET /css/bootstrap.css" - 200 OK
10.18.40.100:49519 - - [19/Jun/2014 17:07:06] "HTTP/1.1 GET /js/jquery-1.8.2.min.js" - 200 OK
10.18.40.100:49518 - - [19/Jun/2014 17:07:06] "HTTP/1.1 GET /css/bootstrap-responsive.css" - 200 OK
10.18.40.100:49520 - - [19/Jun/2014 17:07:06] "HTTP/1.1 GET /js/bootstrap.js" - 200 OK
10.18.40.100:49520 - - [19/Jun/2014 17:07:06] "HTTP/1.1 GET /img/baidu_mini.png" - 200 OK
10.18.40.100:49518 - - [19/Jun/2014 17:07:06] "HTTP/1.1 GET /img/glyphicons-halflings.png" - 200 OK
10.18.40.100:49518 - - [19/Jun/2014 17:07:06] "HTTP/1.1 GET /favicon.ico" - 200 OK

显然,.png.ico.css.js 文件在我的服务器中是静态且全局有效的。所以,我的问题是: 我怎样才能避免这种情况并让浏览器缓存这些静态文件,除非按 Ctrl+F5

附录,如何在 web.py 中提供静态文件,在我的 index.py 文件中的代码如下:

"""register serve"""
urls=('/', 'index',
    '/favicon.ico','favicon',
    '/(js|css|img)/(.*)', 'static')


"""def class to support serve"""
class static:
    def GET(self, media, fn):
        rmod="r"
        if fn.endswith(".png"):
            rmod="rb"
        f = open(media+'/'+fn, rmod)
        try:
            stream = f.read()
            return stream
        except:
            f.close()
            return '404 Not Found'

class favicon:
    def GET(self):
        f = open("static/favicon.ico", 'rb')                                                                                                                                                                                                
        return f.read()  

然后在我的模板 html 文件中使用这些静态文件服务器:

<link href="css/bootstrap.css" rel="stylesheet" media="screen">
<link href="css/bootstrap-responsive.css" rel="stylesheet">
<script src="js/jquery-1.8.2.min.js"></script>
<script src="js/bootstrap.js"></script>    

【问题讨论】:

    标签: python browser-cache web.py


    【解决方案1】:

    不应通过web.py 提供静态文件。相反,您应该将您的网络服务器配置为根据对适当 URL 的请求为它们提供服务 - 一个常见的设置是提供一个 static 目录,所有静态文件都驻留在该目录中。

    有关如何配置静态文件服务的详细信息将根据您的网络服务器(apache、lighttpd、...)和接口技术(fastCGI、mod_wsgi...)而有所不同。您可以在 the cookbook

    Deployment 部分找到常用配置

    【讨论】:

    • 不,web.py 可以提供静态文件。这是一个简单的应用程序,所以我只使用 web.py 作为我的网络服务器。关于如何请参考:webpy.org/cookbook/staticfiles
    • @eason 我从来没有说过不能 - 只有它不应该。它不是一个合适的网络服务器,我认为它没有缓存管理等高级功能。如果它是一个如此简单的应用程序,你为什么还要担心缓存呢?