Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 使用瓶子.py和blobstore GAE_Google App Engine_Blobstore_Bottle - Fatal编程技术网

Google app engine 使用瓶子.py和blobstore GAE

Google app engine 使用瓶子.py和blobstore GAE,google-app-engine,blobstore,bottle,Google App Engine,Blobstore,Bottle,我最近开始使用bottle和GAE blobstore,虽然我可以将文件上传到blobstore,但似乎找不到从商店下载文件的方法 我遵循了文档中的示例,但仅在上传部分成功。我无法将该示例集成到我的应用程序中,因为我使用的框架与webapp/2不同 我将如何创建上载处理程序和下载处理程序,以便获取上载blob的密钥并将其存储在数据模型中,然后在下载处理程序中使用它 我尝试使用BlobInfo.all()创建一个查询blobstore,但无法获取实体的key name字段值 这是我第一次与blob

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

我遵循了文档中的示例,但仅在上传部分成功。我无法将该示例集成到我的应用程序中,因为我使用的框架与webapp/2不同

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

我尝试使用
BlobInfo.all()
创建一个查询blobstore,但无法获取实体的key name字段值


这是我第一次与blobstore交互,因此我不介意就解决问题的更好方法提出建议。

对于服务blob,我建议您查看。将它移植到瓶子应该很容易,因为框架没有什么特别的地方

下面是一个关于如何使用
BlobInfo.all()
的示例:

用于blobstore.BlobInfo.all()中的信息:
self.response.out.write('Name:%s键:%s大小:%s创建:%s ContentType:%s
“%”(info.filename,info.Key(),info.Size,info.create,info.content\u type))
对于提供一个blob,我建议您查看。将它移植到瓶子应该很容易,因为框架没有什么特别的地方

下面是一个关于如何使用
BlobInfo.all()
的示例:

用于blobstore.BlobInfo.all()中的信息:
self.response.out.write('Name:%s Key:%s Size:%s Creation:%s ContentType:%s
'%(info.filename,info.Key(),info.Size,info.Creation,info.content_type))
对于下载,您只需要生成一个响应,其中包括标题“X-AppEngine-BlobKey:[您的blob_密钥]”,以及您需要的所有其他内容,如内容处置标题(如果需要)。或者,如果它是一个图像,您可能只需要使用高性能图像服务api,生成一个url并重定向到它。。。。完成

对于上传,除了为appengine编写一个处理程序,以便在上传安全进入blobstore(文档中)后调用

您需要一种在传入请求中查找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

对于下载,您只需要生成一个响应,其中包含标题“X-AppEngine-BlobKey:[您的blob_密钥]”,以及您需要的所有其他内容,如内容处置标题(如果需要)。或者,如果它是一个图像,您可能只需要使用高性能图像服务api,生成一个url并重定向到它。。。。完成

对于上传,除了为appengine编写一个处理程序,以便在上传安全进入blobstore(文档中)后调用

您需要一种在传入请求中查找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

对于将来寻找这个答案的人来说,要做到这一点,你需要瓶子(哦!)和defnull的模块

由于创建上传URL通常足够简单,并且根据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

很抱歉,如果代码中有任何错误,这是我无法想象的。

对于将来寻找这个答案的人,要做到这一点,你需要瓶子(d'oh!)和defnull的模块

由于创建上传URL通常足够简单,并且根据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
对不起,如果代码中有任何错误,那是我无法想象的