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_streamcss_from_pkg_stream的快捷方式从包中加载文件。

这些函数的必需公共参数是:

  • __name__用于标识包中的文件名。
  • 路径是__name__所属包中的路径。

可选参数为:

  • merge定义是否允许资源与其他类似资源合并。默认值是True
  • 使用prio可以在资源管理器中定义资源的顺序。先加载数字较低的资源。默认值是1
  • name是一个可选的名称,在该名称下资源可以聚集在一起。然后可以一起检索具有相同名称的资源。它默认为""。在本例中,前两个css资源将一起检索,因为它们都具有相同的空名称。
  • processors定义一个可选的处理器函数列表,这些函数将资源内容作为输入并输出另一个(例如,压缩的)版本。
  • auto_reload定义是否可以重新加载资源。请注意,这必须在资源和资源管理器中设置。

css特定参数

  • mediaf定义要用于此样式表的媒体类型,例如printscreen。它可以是字符串或字符串列表。默认值是['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可以是TrueFalse,并定义资源是否合并到集群中。
  • 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 Okheaders(key, value)元组的列表。

更改历史记录

0.6-(未发布)

  • 修正了命名错误:如果资源有不同的名称和不同的prio,它们只会被排序 按优先顺序。这导致合并错误,因为在尝试合并时名称不断更改。 现在它们是按名称先排序,然后按优先级排序的。

0.5-(2010/04/06)

初始版本

下载

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java变量始终存储0值。为什么?   如何使用Java/REST将Azure blob从一个存储容器移动到另一个存储容器?   java将commons DBCP从1.2升级到1.4,我应该害怕吗?   java如何使用分隔符拆分字符串?   java使用数组读取json对象   java在groovy中切片字符串   交换数组java的两个邻域元素   java移动用于确定字符串是否为回文的逻辑   java Android应用程序在一个活动中崩溃   java Sparkjava将webapp文件夹设置为静态资源/模板的文件夹   java复杂条件表达式,用户易用。   java如何仅在表存在时从表中选择值   java I无法将数据从Recyclerview传递到其他活动   java数据结构最佳设计(大数据)   java Android从DatePickerDialogFragment中删除日历视图   java将数据从Firebase获取到片段   数组。sort()在java中运行不正常