用于在CDN上管理Pyramid静态文件的工具
项目描述
从CDN提供静态文件
内容分发网络(CDN)允许您更快地向用户提供服务静态文件。对于Web应用程序,主要优势是您的页面渲染速度更快,从而提供更好的用户体验。
此外,JavaScript或CSS文件等内容在放置到CDN之前应该“瘦身”。通过减小文件大小,您还可以进一步提高用户体验,使加载速度更快。
van.static为您提供了一项工具,您可以选择将其文件部署到CDN,而不会使开发过程更加复杂。
工作流程
此工具有助于使用静态文件和pyramid实现一个非常具体的工作流程
在开发过程中,静态文件存储在子版本控制系统中,并在Pyramid应用程序中正常配置。
在部署之前,系统管理员从egg中提取静态文件并将其上传到CDN。CDN上的URL根据提取文件所用的egg版本而有所不同。
在提取过程中,CSS和JS文件可以可选地进行压缩。
在生产中,系统管理员配置应用程序以使用CDN上的静态文件。
此工作流程具有以下优势
对开发的影响最小。文件更改立即可见,开发者也使用未压缩的文件。
由CDN提供的文件可以具有非常长的缓存控制时间,同时仍然允许它们在应用程序升级时几乎立即更新。
测试提取功能
您可以通过直接运行 cdn.py 文件来试用提取工具。以下命令将从 deform 包中提取 static 资源到 test_extract 目录:
$ mkdir test_extract $ python van/static/cdn.py –target “file://$(pwd)/test_extract” –resource deform:static
注意:deform 包必须位于 Python 路径上。
如果您使用类似这样的 URL s3://mybucket/path/to/files/,则提取的资源将直接放置在 Amazon S3 中。您需要手动安装 boto 以使用此功能。
在您的应用程序中实现
一种方法是在您的包中包含如下代码:
>>> def my_extract_filesystem_command(): ... """Customized extract command for my application""" ... cdn.extract_cmd(['myapp:static', 'deform:static'], yui_compressor=True)>>> from pyramid.config import Configurator >>> def make_pyramid_app(cdn_url=None): ... config = Configurator() ... config.include('van.static.cdn') ... config.add_cdn_view(cdn_url or 'myapp_static', 'myapp:static') ... config.add_cdn_view(cdn_url or 'deform_static', 'deform:static') ... return config.make_wsgi_app()
您会将 my_extract_filesystem_command 制作为一个系统管理员在部署时运行的命令行脚本。同样,cdn_url 配置选项由系统管理员设置为文件导出的 URL。
GZip 内容编码压缩
支持在提取期间对 S3 目标进行资源压缩。目前 S3 和 Cloudfront 不直接支持即时压缩,因此使用一种变通方法,上传多个资源副本。一个没有编码,其余的有编码。
然后根据浏览器的功能生成指向压缩或非压缩资源的链接。
以下是如何在 Pyramid 应用程序中修改资源生成的一个示例
>>> from pyramid.request import Request >>> class ZippingPyramidRequest(Request): ... ... def static_url(self, path, **kw): ... if 'gzip' in self.accept_encoding: ... package, path = path.split(':', 1) ... path = '{package}:gzip/{path}'.format( ... package=package, ... path=path) ... return Request.static_url(self, path, **kw)
提取器配置为使用带有 –encoding 参数的 gzip 编码上传资源。
警告:HTTP Vary 必须包含 Accept-Encoding 以与任何缓存良好地协作。
APT 集成
对于使用 APT 安装软件包的系统管理员,一个有用的技巧是将片段放入 /etc/apt/apt.conf.d/
DPkg::Post-Invoke:: "/path/to/extraction/script";
这样,当在应用程序服务器上安装软件包时,提取脚本就会运行。注意,如果您已安装 etckeeper,则应将其放在之后。
JSLint 测试支持
注意:要使用此功能,您必须在您的 PATH 中有一个 jslint 命令。
这允许您从 unittest 运行 jslint 命令,对目录中的所有文件进行测试。例如
>>> import unittest>>> class TestJSLint(unittest.TestCase): ... ... def test_static(self): ... from van.static.testing import assert_jslint_dir ... from pkg_resources import resource_filename, cleanup_resources ... assert_jslint_dir(resource_filename('vanguardistas.publicview', 'static/js')) ... cleanup_resources()
YUI3 载入器配置辅助工具
van.static.yui 包含简化从 JS 模块目录设置 YUI3 载入器配置的实用工具。
贡献
如果您感兴趣,主要开发仓库在 github 上 https://github.com/jinty/van.static