Python 如何从处理程序中的blobstore检索文件对象?

Python 如何从处理程序中的blobstore检索文件对象?,python,google-app-engine,blobstore,Python,Google App Engine,Blobstore,我在blobstore中保存了一个文档,并试图在处理程序(处理任务)中检索它。我已经读过关于如何使用blobstore的书,但我正在努力让它在我的案例中发挥作用。我在处理程序中尝试了以下操作,但似乎无法将对象作为保存的文件返回(例如.pdf或.txt) 我也试过了 class ServeSavedDocument(blobstore_handlers.BlobstoreDownloadHandler): def get(self, blob_key): self.send_blob(

我在blobstore中保存了一个文档,并试图在处理程序(处理任务)中检索它。我已经读过关于如何使用blobstore的书,但我正在努力让它在我的案例中发挥作用。我在处理程序中尝试了以下操作,但似乎无法将对象作为保存的文件返回(例如.pdf或.txt)

我也试过了

class ServeSavedDocument(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, blob_key):
    self.send_blob(blob_key, save_as=True)
    return

class SendDocuments(webapp2.RequestHandler):
    def post(self):
        document_key = self.request.get("document_key")
        document_key = Key(str(document_key))
        the_document = DocumentsModel.all().filter("__key__ =", document_key).get()
        grab_blob = ServeSavedDocument()
        file_data = grab_blob.get(self, str(the_document.blobstore_key))
但是对ServeSavedDocument的调用失败

'NoneType' object has no attribute 'headers'
我已经看过了,但唯一一个没有保存文件的示例似乎只是返回blob键,即

blob_key = files.blobstore.get_blob_key(file_name)    
从处理程序中获取blobstore中保存的文件的最佳方法是什么

编辑1: 我试图从blobstore中检索txt文件或pdf文件,其格式/状态可以使用以下代码在post请求中编码为文件

from google.appengine.api import urlfetch
from poster.encode import multipart_encode
# assuming here that file_data is the file object
payload = {}
payload['user_id'] = '1234123412341234'
payload['test_file'] = MultipartParam('test_file', filename=file_data.filename,
                                      filetype=file_data.type,
                                      fileobj=file_data.file)
data,headers= multipart_encode(payload)
send_url = "http://127.0.0.0/"
t = urlfetch.fetch(url=send_url, payload="".join(data), method=urlfetch.POST, headers=headers)

看一看BlobReader类,我认为这就是您要寻找的:

它允许对blobstore数据进行类似文件的读取访问:

# blob_key = ..

# Instantiate a BlobReader for a given Blobstore value.
blob_reader = blobstore.BlobReader(blob_key)
# Read the entire value into memory. This may take a while depending
# on the size of the value and the size of the read buffer, and is not
# recommended for large values.
value = blob_reader.read()

尝试这样做,在
send\u blob()
中指定文件名及其类型,如下所示:

def mime_type(filename):
    return guess_type(filename)[0]
    class ServeSavedDocument(blobstore_handlers.BlobstoreDownloadHandler):
        def get(self):
            blob_key = self.request.get("blob_key")
            if blob_key:
                blob_info = blobstore.get(blob_key)               
                if blob_info:
                    save_as1 =  blob_info.filename
                    type1=mime_type(blob_info.filename)
                    self.send_blob(blob_info,content_type=type1,save_as=save_as1)

好吧,经过一番周折之后,我发现这是可行的!关键是简单地调用blobinfo对象上的open()

class SendDocuments(webapp2.RequestHandler):
    def post(self):
        document_key = self.request.get("document_key")
        document_key = Key(str(document_key))
        the_document = DocumentsModel.all().filter("__key__ =", document_key).get()
        file_data = blobstore.BlobInfo.get(str(the_document.blobstore_key))
        payload = {}
        payload['user_id'] = '1234123412341234'
        payload['test_file'] = MultipartParam('the_file', filename="something",
                                      filetype=file_data.content_type,
                                      fileobj=file_data.open())

“将对象作为保存的文件返回”是什么意思"? 文件只是数据的容器;blobstore API返回该数据。你是在尝试向用户提供blob,还是在使用应用程序中的数据?前者在blobstore文档中有一个完整的工作示例;你试过了吗?嗨,尼克,我已经掌握了如何让blobstore通过查看文档将blob返回给用户。我想做的是获取一个存储在blobstore中的文本文件,并通过使用python海报库在多部分post请求中对该文件进行编码,将其发送到外部(文件处理API)。您好,谢谢您的建议。我已经尝试过这个方法,但是值是以字符串形式返回的,但我需要它是一个类似文件的对象,这样它才适合多部分后编码-请参见上面的编辑1:)您对类似文件的对象的定义是什么?blobstore.BlobReader是最接近文件对象的对象,这在Python()的上下文中是众所周知的。您好,很抱歉没有解释-我还在学习:)除了语义之外,我的目标是找到一种在多部分post请求中对文件进行编码的方法-我在post的第一次编辑中给出了一个示例。您好,谢谢你的密码。假设您打算让该类与def mime_type处于相同的缩进级别,我尝试实现这个方法,但是type1返回为None。此外,self.send_blob因“NoneType”对象没有属性“headers”而失败。
class SendDocuments(webapp2.RequestHandler):
    def post(self):
        document_key = self.request.get("document_key")
        document_key = Key(str(document_key))
        the_document = DocumentsModel.all().filter("__key__ =", document_key).get()
        file_data = blobstore.BlobInfo.get(str(the_document.blobstore_key))
        payload = {}
        payload['user_id'] = '1234123412341234'
        payload['test_file'] = MultipartParam('the_file', filename="something",
                                      filetype=file_data.content_type,
                                      fileobj=file_data.open())