【问题标题】:How do I update attachment content with the google sites python API?如何使用谷歌站点 python API 更新附件内容?
【发布时间】:2012-11-07 08:33:27
【问题描述】:

我正在尝试编写一个脚本,该脚本将自动更新通过 Google 协作平台创建和管理的网站上的一些附件。这应该是可能的,因为谷歌在 9 月发布了 Sites APIPython GData API 声明以支持网站。但是,我能找到的最接近的方法称为 client.update,它允许我更新附件的元数据,但不能更新内容。

在 Java API 中,更新附件是通过创建一个新的 MediaFileSource 然后调用 entry.setMediaFileSource(source)entry.updateMedia() 来完成的。但是,我在 Python API 中找不到类似的东西。我是不是很笨,只是错过了一些东西,还是真的无法使用 python API 更新谷歌网站的附件?

【问题讨论】:

    标签: python gdata-api google-sites


    【解决方案1】:

    文档here 提供了有关如何更新附件内容和元数据的示例(替换附件的内容和元数据小节)

    唯一剩下的就是获取existing_attachment,这可以通过以下方式轻松完成:

    existing_attachment = None
    uri = '%s?kind=%s' % (client.MakeContentFeedUri(), 'attachment')
    feed = client.GetContentFeed(uri=uri)
    for entry in feed.entry:
      if entry.title.text == title:
        print '%s [%s]' % (entry.title.text, entry.Kind())
        existing_attachment = entry
    

    【讨论】:

      【解决方案2】:

      sites api 已更新至 v1.1;这可能是一个新的补充

      http://code.google.com/apis/sites/docs/1.0/developers_guide_python.html#UpdatingContent

      【讨论】:

      • 我们有一个赢家,虽然他们的指南有点不正确。而不是使用entry.content.text = "YOUR NEW HTML",您需要使用entry.content = atom.data.Content("YOUR NEW HTML"),否则它只会预先添加数据。您的指针对解决这个问题非常有帮助。
      【解决方案3】:

      好吧,那里的API很奇怪,文档也不是很清楚。这是我想出来的。第一次上传附件时,通过 UploadAttachment 方法完成,但在后续尝试时,您需要调用 Update。这是执行此操作的代码:

      class AttachmentUploader(object):
        """Uploads a given attachment to a given filecabinet in Google Sites."""
      
        def __init__(self, site, username, password):
          self.client = gdata.sites.client.SitesClient(
              source="uploaderScript", site=site)
          self.client.ssl = True
          try:
            self.client.ClientLogin(username, password, "some.key")
          except:
            traceback.print_exc()
            raise
      
        def FindAttachment(self, title):
          uri = "%s?kind=%s" % (self.client.MakeContentFeedUri(), "attachment")
          feed = self.client.GetContentFeed(uri=uri)
          for entry in feed.entry:
            if entry.title.text == title:
              return entry
          return None
      
        def FindCabinet(self, title):
          uri = "%s?kind=%s" % (self.client.MakeContentFeedUri(), "filecabinet")
          feed = self.client.GetContentFeed(uri=uri)
          for entry in feed.entry:
            if entry.title.text == title:
              return entry
          return None
      
        def Upload(self, cabinet_title, title, file_path, description):
          """Upload the given file as attachment."""
          ms = gdata.data.MediaSource(file_path=file_path, content_type="text/ascii")
      
          existing_attachment = self.FindAttachment(title)
          if existing_attachment is not None:
            existing_attachment.summary.text = description
            updated = self.client.Update(existing_attachment, media_source=ms)
            print "Updated: ", updated.GetAlternateLink().href
          else:
            cabinet = self.FindCabinet(cabinet_title)
            if cabinet is None:
              print "OUCH: cabinet %s does not exist" % cabinet_title
              return
            attachment = self.client.UploadAttachment(
                ms, cabinet, title=title, description=description)
            print "Uploaded: ", attachment.GetAlternateLink().href
      

      【讨论】:

      • 感谢详细课程的帮助。最初的问题是 API 当时不支持更新附件。你仍然可以得到积分,因为这对未来寻求实施的人们非常有帮助。
      【解决方案4】:

      有一个upload_attachment 方法,应该可以工作。您可能还想查看用于 Sites API 的 sample code,它使用该方法。

      【讨论】:

      • 不幸的是,虽然这适用于上传附件,但它不允许更新附件,这是我需要做的。使用重复文件名调用 upload_attachment 会返回错误:服务器响应:409,重复插入 - 名为“test.txt”的节点已存在 - 现有节点 ID 为 4770556649999999999
      • 我认为唯一的方法是使用 Java 库的方式:code.google.com/apis/sites/docs/1.0/… 当前的 Python 库代码使用 gdata 协议,这是未记录的。解决方法是从 gdata 客户端获取 ClientLogin 授权,并自行通过 PUT 方法发出 http 请求。或者把旧文件删了,再上传新的,太坑爹了。
      • 我的印象是Java库也使用了GData协议。所以,从它的声音来看,现在用 Python 真的不可能。我考虑过删除并重新添加,但这真的很糟糕,并且可能会破坏一些链接。也许我只需要等一会儿……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多