需要帮助处理Google App Engine Blobstore上传表单
我正在学习blobstore API... 我已经能够成功上传文件并获取它们,但在尝试将上传表单和普通网页表单结合起来时遇到了困难,我想为文件关联一些额外的信息,比如文件的昵称。
下面是我正在玩的一款简单应用的代码。这个应用是基于谷歌提供的示例。
#!/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键传递得很好,但其他内容却没有。
有人能告诉我我哪里出错了吗,或者推荐一个好的教程来描述这个用例吗?
1 个回答
4
问题在于,当你把请求重定向到"/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