Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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
Python 需要使用谷歌应用程序引擎Blobstore处理上传表单的帮助吗_Python_Google App Engine_Blobstore - Fatal编程技术网

Python 需要使用谷歌应用程序引擎Blobstore处理上传表单的帮助吗

Python 需要使用谷歌应用程序引擎Blobstore处理上传表单的帮助吗,python,google-app-engine,blobstore,Python,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 webap

我正在学习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键通过得很好,但其他的都没有


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

问题是,当您将请求重定向到“/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')