Нужна помощь в обработке формы загрузки в Blobstore Google App Engine - PullRequest
3 голосов
/ 08 октября 2010

Я пытаюсь изучить API Blobstore ... и я могу успешно загрузить файлы и получить их обратно, но мне не повезло, пытаясь объединить форму загрузки с обычной веб-формой, чтобы иметь возможность чтобы связать дополнительную информацию с файлом, например, псевдоним для файла.

Ниже приведен код простого приложения, с которым я играл. Он основан на примере, предоставленном 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()

Согласно документации, обработчик хранилища больших двоичных объектов должен проходить через ключ blob, а остальная часть формы - к обработчику, перенаправленному на ... ключ большого двоичного объекта, проходит нормально, но больше ничего не происходит.

Может кто-нибудь указать, где я напутал, или указать хороший учебник, описывающий этот вариант использования?

1 Ответ

4 голосов
/ 08 октября 2010

Проблема в том, что ваши данные опубликованной формы теряются при перенаправлении запроса в "/ 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...