【问题标题】:Avoid repeated calls to an API in Jekyll Ruby plugin避免在 Jekyll Ruby 插件中重复调用 API
【发布时间】:2013-03-05 22:02:37
【问题描述】:

我编写了一个 Jekyll 插件,通过使用 garb gem 调用 Google Analytics API 来显示页面上的综合浏览量。我的方法唯一的问题是它会为每个页面调用 API,从而减慢构建时间,并且可能会达到 API 的用户调用限制。

可以在一次调用中返回所有数据并将其存储在本地,然后查找每个页面的浏览量,但我的 Jekyll/Ruby-fu 还达不到标准。我不知道如何编写插件运行一次以获取所有数据并将其存储在本地我当前的函数可以访问它的地方,而不是逐页调用 API。

基本上我的代码是写成可以放入我的页面布局的液体块:

 class GoogleAnalytics < Liquid::Block
    def initialize(tag_name, markup, tokens)
      super # options that appear in block (between tag and endtag)
      @options = markup # optional optionss passed in by opening tag
    end
    def render(context)
      path = super
      # Read in credentials and authenticate 
      cred = YAML.load_file("/home/cboettig/.garb_auth.yaml")
      Garb::Session.api_key = cred[:api_key]
      token = Garb::Session.login(cred[:username], cred[:password])
      profile = Garb::Management::Profile.all.detect {|p| p.web_property_id == cred[:ua]}

      # place query, customize to modify results
      data = Exits.results(profile, 
                           :filters => {:page_path.eql => path}, 
                           :start_date => Chronic.parse("2011-01-01"))

      data.first.pageviews
    end

Full version of my plugin is here

如何将所有对 API 的调用转移到其他函数并确保 jekyll 在开始时运行一次,然后调整上面的标签以读取本地数据?

EDIT 看起来这可以通过生成器完成并将数据写入文件。请参阅this branch 上的示例现在我只需要弄清楚如何对结果进行子集化:https://github.com/Sija/garb/issues/22

【问题讨论】:

  • 为什么要参考谷歌?在本地存储您的页数。无论如何,它们会更准确。
  • 恐怕你得澄清一下。我首先使用谷歌分析来记录浏览量。我该怎么做(这在功能上不等效?)任何方法都必须在 Jekyll 运行时获取当前的浏览量,然后将其添加到每个页面,所以问题仍然存在。
  • 其实问题不一样。您遇到的问题是您在每次页面加载时都从谷歌中提取信息。通过仅将它们存储在本地,您可以完成两件事。首先,您将获得更准确的数据;但更重要的是,如果您仍然在每个页面加载时都进行查询,那么这没什么大不了的。就目前而言,如果您将两者合并:仅在启动时查询谷歌但维护本地缓存,您会看到您的数字略有不同。
  • 不,我不是。 Jekyll 是一个静态 站点生成器。请参阅github.com/mojombo/jekyll 了解背景信息。数据仅与上次构建一样最新,这对我来说很好。我想在构建时存储数据以加快构建并减少 API 调用。

标签: ruby api jekyll garb-gem


【解决方案1】:

要存储数据,我必须:

  1. 编写一个生成器类(参见Jekyll wiki plugins)来调用API。

  2. 将数据转换为哈希(为了方便按路径查找,请参见 5):

    result = Hash[data.collect{|row| [row.page_path, [row.exits, row.pageviews]]}]
    
  3. 将数据哈希写入 JSON 文件。

  4. 从我现有的 Liquid 块类中的文件中读取数据。

    请注意,块标签在_includes 目录下工作,而生成器在根目录下工作。

  5. 匹配页面路径,数据转换为哈希后很容易:

    result[path][1]
    

Code for the full plugin, showing how to create the generator and write files, etc, here

感谢 GitHub 上的 Sija 在这方面提供帮助。

【讨论】:

  • 您的问题似乎与我目前遇到的问题有关(请参阅this comment)。你知道怎么解决吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2021-07-21
  • 2014-08-16
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
相关资源
最近更新 更多