【问题标题】:Need help processing upload form with Google App Engine Blobstore需要帮助使用 Google App Engine Blobstore 处理上传表单
【发布时间】:2010-10-08 03:38:59
【问题描述】:

我正在尝试学习 blobstore API...并且我能够成功上传文件并将它们取回,但我没有任何运气尝试将上传表单与常规网络表单结合起来能够将额外信息与文件相关联,例如文件的昵称。

下面是我一直在玩的一个简单应用的代码。它基于 google 提供的示例。

#!/usr/bin/env python
#

import os
import urllib

from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

class StoredFiles(db.Model):
    nickname = db.StringProperty()
    blobkey = blobstore.BlobReferenceProperty()

    @staticmethod
    def get_all():
        query = db.Query(StoredFiles)
        files = query.get()

        return files


def doRender(handler, page, templatevalues=None):
    path = os.path.join(os.path.dirname(__file__), page)
    handler.response.out.write(template.render(path, templatevalues))

class MainHandler(webapp.RequestHandler):
    def get(self):

        allfiles = StoredFiles.get_all()

        upload_url = blobstore.create_upload_url('/upload')

        templatevalues = {
                'allfiles': allfiles,
                'upload_url': upload_url,

            }
        doRender(self, 'index.html', templatevalues)

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        upload_files = self.get_uploads('file')
        blob_info = upload_files[0]

        self.redirect('/save/%s' % blob_info.key())

class SaveHandler(webapp.RequestHandler):

    def get(self, resource):

        newFile = StoredFiles()
        newFile.nickname = self.request.get('nickname')
        resource = str(urllib.unquote(resource))
        newFile.blobkey = resource

        newFile.put()

        self.redirect('/')

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, resource):
        resource = str(urllib.unquote(resource))
        blob_info = blobstore.BlobInfo.get(resource)
        self.send_blob(blob_info)

def main():
    application = webapp.WSGIApplication(
          [('/', MainHandler),
           ('/upload', UploadHandler),
           ('/save/([^/]+)?', SaveHandler),
          ], debug=True)
    run_wsgi_app(application)

if __name__ == '__main__':
  main()

根据文档,blobstore 处理程序应该通过 blob 键和表单的其余部分传递给重定向到的处理程序... blob 键通过就好了,但没有别的。

有人可以指出我在哪里搞砸了,或者给我一个描述这个用例的好教程吗?

【问题讨论】:

    标签: python google-app-engine blobstore


    【解决方案1】:

    问题是当你将请求重定向到“/save/%s”时,你发布的表单数据丢失了,这是正常的。

    您应该将代码放在 UploadHandler 中,而不是重定向,就像这样(未经测试的代码):

    class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
        def post(self):
            try:
                upload_files = self.get_uploads('file')
                blob_info = upload_files[0]
    
                newFile = StoredFiles()
                newFile.nickname = self.request.get('nickname')
                newFile.blobkey = blob_info.key()
                newFile.put()
    
                self.redirect('/')
            except:
                self.redirect('/upload_failure.html')
    

    请参阅文档中的此页面以获取类似示例:http://code.google.com/appengine/docs/python/tools/webapp/blobstorehandlers.html#BlobstoreUploadHandler

    【讨论】:

    • 谢谢!我以为我以前尝试过类似的方法但失败了,但我确信还有其他一些错误正在蔓延。今天晚些时候将尝试您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多