css和js的资源管理器
quantumcore.resources的Python项目详细描述
下面是一个关于如何在css资源中使用它的示例。
首先,我们设置一些资源:
from quantumcore.resources import CSSResourceManager, css_from_pkg_stream from quantumcore.resources import JSResourceManager, js_from_pkg_stream, jst_from_pkg_stream r1 = css_from_pkg_stream(__name__, 'static/css/screen.css', merge=True, auto_reload=True) r2 = css_from_pkg_stream(__name__, 'static/css/addons.css', merge=True, auto_reload=True) r3 = css_from_pkg_stream(__name__, 'static/css/print.css', merge=True, name="print", auto_reload=True) css_manager = CSSResourceManager([r1,r2,r3], prefix_url="/css", auto_reload=True) # JS js_manager = JSResourceManager([ js_from_pkg_stream(__name__, 'static/js/jquery.json-2.2.min.js', merge=True, prio=2), js_from_pkg_stream(__name__, 'static/js/jquery.cookie.js', merge=True, minimize_method="jsmin", prio=3), ], prefix_url="/js", auto_reload=True)
这定义了两个css和两个js资源。
实例化资源
资源对应于文件系统上的一个文件。在这里,我们使用名为js_from_pkg_stream和css_from_pkg_stream的快捷方式从包中加载文件。
这些函数的必需公共参数是:
- __name__用于标识包中的文件名。
- 路径是__name__所属包中的路径。
可选参数为:
- merge定义是否允许资源与其他类似资源合并。默认值是True。
- 使用prio可以在资源管理器中定义资源的顺序。先加载数字较低的资源。默认值是1。
- name是一个可选的名称,在该名称下资源可以聚集在一起。然后可以一起检索具有相同名称的资源。它默认为""。在本例中,前两个css资源将一起检索,因为它们都具有相同的空名称。
- processors定义一个可选的处理器函数列表,这些函数将资源内容作为输入并输出另一个(例如,压缩的)版本。
- auto_reload定义是否可以重新加载资源。请注意,这必须在资源和资源管理器中设置。
css特定参数
- mediaf定义要用于此样式表的媒体类型,例如print或screen。它可以是字符串或字符串列表。默认值是['screen', 'projection']。
js特定参数
- minimize_method是"jsmin"或None,如果给出第一个,那么javascript代码也将被缩小,这意味着删除空白和缩短变量。
实例化资源类
如果有字符串,还可以直接实例化CSSResource,或者 JSResource类:
r = CSSResource( source = u'my CSS', minimize_method = None, media = ['projection', 'screen'], type_ = u'text/css', ... ) r = JSResource( source = u'my JS', minimize_method = None, type_ = u'text/css', ... )
除了__name__和filename之外,上述所有参数都适用。
资源经理
在上面的示例中,我们看到了这样的资源管理器:
css_manager = CSSResourceManager([r1,r2,r3], prefix_url="/css", auto_reload=True) js_manager = JSResourceManager([.....], prefix_url="/js", auto_reload=True)
它们处理项目中使用的所有css和js文件,这些文件最终被分组到集群中。
这两个版本都采用prefix_url,稍后将根据该值提供服务。这定义了哪些url将由manager实例计算。
可选参数为:
- no_merge可以是True或False,并定义资源是否合并到集群中。
- auto_reload定义管理器是否应测试资源是否已更改并且应重新加载。只有当资源的auto_reload也设置为True时,这才有效。
我们也可以稍后添加资源:
css_manager.append(resource3) js_manager.append(resource4)
现在我们可以将此资源对象传递给模板,例如,chameleon模板:
template.render(js_manager = js_manager, css_manager = css_manager)
模板代码如下所示:
<tal:block replace="structure css_resources()" /> <tal:block replace="structure js_resources()" />
这将呈现指向所有未命名集群的链接(意味着没有name参数的资源 给出)。您还可以使用以下特定名称呈现指向所有资源的链接:
<!--[if lt IE 8]> <tal:block replace="structure css_resources('ie')" /> <![endif]-->
将使用name='ie'呈现所有资源。
在生成的html中,这与以下内容类似:
<link href="/css/style.css?h=0140632a9c7bdfec7a2a73829e37d18a" media="projection, screen" rel="stylesheet" type="text/css" /> <link href="/css/ie.css?h=4e743c01195a9352f5b3763f8dcffd69" media="projection, screen" rel="stylesheet" type="text/css" /> <script src="/js/script.js?h=15b10405313c16a428bce63782ed86c7" type="text/javascript"></script>
如您所见,如果可能的话,这些资源被聚集到文件中。此外,还为每个资源链接提供了一个缓存密钥,如果内容发生更改,缓存密钥将发生更改。
服务资源
要提供这些文件,我们必须将url传递给资源注册表。在wsgi应用程序中,这可能看起来像这样:
def __call__(self, environ, start_response): path = environ['PATH_INFO'].split("/") if path[1]=="css": css_manager.render_wsgi(environ, start_response) elif path[1]=="js": js_manager.render_wsgi(environ, start_response)
这将采用wsgi环境中的路径,并检查它是否与生成的url之一匹配。
如果没有wsgi,它可能看起来像这样:
code, data, headers = resources.render(url)
data是一个迭代器,包含合并的最小化css文件,code是返回代码,通常是200 Ok。 headers是(key, value)元组的列表。
更改历史记录
0.6-(未发布)
- 修正了命名错误:如果资源有不同的名称和不同的prio,它们只会被排序 按优先顺序。这导致合并错误,因为在尝试合并时名称不断更改。 现在它们是按名称先排序,然后按优先级排序的。
0.5-(2010/04/06)
初始版本