使用bottle.py和blobstore GAE

时间:2012-10-22 23:07:55

标签: google-app-engine blobstore bottle

我最近开始使用bottle和GAE blobstore,虽然我可以将文件上传到blobstore,但我似乎找不到从商店下载它们的方法。

我按照文档中的示例进行了操作,但仅在上传部分成功。我无法在我的应用程序中集成该示例,因为我使用的是webapp / 2中的其他框架。

我如何创建上传处理程序和下载处理程序,以便我可以获取上传的blob的密钥并将其存储在我的数据模型中,并在以后的下载处理程序中使用它?

我尝试使用BlobInfo.all()在blobstore中创建查询,但我无法获取实体的密钥名称字段值。

这是我与blobstore的第一次互动,所以我不介意更好地解决问题的建议。

3 个答案:

答案 0 :(得分:1)

为了服务blob,我建议你看看source code of the BlobstoreDownloadHandler。将它移植到瓶子应该很容易,因为没有什么特别的框架。

以下是有关如何使用BlobInfo.all()的示例:

for info in blobstore.BlobInfo.all():
  self.response.out.write('Name:%s Key: %s Size:%s Creation:%s ContentType:%s<br>' % (info.filename, info.key(), info.size, info.creation, info.content_type))

答案 1 :(得分:0)

对于下载,您只需生成一个响应,其中包含标题“X-AppEngine-BlobKey:[您的blob_key]”以及您需要的所有其他内容,如果需要,还可以使用Content-Disposition标头。或者如果它是一个图像你应该只使用服务API的高性能图像,生成一个网址并重定向到它....完成

用于上传,除了在上传安全地在blobstore(在文档中)之后编写一个appengine处理程序来调用

您需要一种方法来查找传入请求中的blob信息。我不知道瓶子里的要求是什么样的。 Blobstoreuploadhandler有一个get_uploads方法,据我所知,它实际上没有必要成为一个实例方法。所以这是一个期望webob请求的示例通用实现。对于瓶子,您需要编写与瓶子请求对象兼容的类似东西。

def get_uploads(request, field_name=None):
    """Get uploads for this request.
    Args:
      field_name: Only select uploads that were sent as a specific field.
      populate_post: Add the non blob fields to request.POST
    Returns:
      A list of BlobInfo records corresponding to each upload.
      Empty list if there are no blob-info records for field_name.

    stolen from the SDK since they only provide a way to get to this
    crap through their crappy webapp framework
    """
    if not getattr(request, "__uploads", None):
        request.__uploads = {}
        for key, value in request.params.items():
            if isinstance(value, cgi.FieldStorage):
                if 'blob-key' in value.type_options:
                    request.__uploads.setdefault(key, []).append(
                        blobstore.parse_blob_info(value))

    if field_name:
        try:
            return list(request.__uploads[field_name])
        except KeyError:
            return []
    else:
        results = []
        for uploads in request.__uploads.itervalues():
            results += uploads
        return results

答案 2 :(得分:0)

对于将来寻找此答案的任何人来说,要做到这一点,你需要瓶子(d&#39;哦!)和defnull的multipart模块。

由于创建上传网址通常非常简单,并且根据GAE文档,我只会介绍上传处理程序。

from bottle import request
from multipart import parse_options_header
from google.appengine.ext.blobstore import BlobInfo

def get_blob_info(field_name):
    try:
        field = request.files[field_name]
    except KeyError:
        # Maybe form isn't multipart or file wasn't uploaded, or some such error
        return None
    blob_data = parse_options_header(field.content_type)[1]
    try:
        return BlobInfo.get(blob_data['blob-key'])
    except KeyError:
        # Malformed request? Wrong field name?
        return None

很抱歉,如果代码中有任何错误,它就不在我的脑海中。