Google app engine 使用瓶子.py和blobstore GAE
我最近开始使用bottle和GAE blobstore,虽然我可以将文件上传到blobstore,但似乎找不到从商店下载文件的方法 我遵循了文档中的示例,但仅在上传部分成功。我无法将该示例集成到我的应用程序中,因为我使用的框架与webapp/2不同 我将如何创建上载处理程序和下载处理程序,以便获取上载blob的密钥并将其存储在数据模型中,然后在下载处理程序中使用它 我尝试使用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
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
对不起,如果代码中有任何错误,那是我无法想象的