视频模型和ndb

Video model and ndb

在 appengine 中,我使用此模型部署了 python 代码以上传视频。

我启用了视频上传 上传视频时,数据存储中出现模型 "Video" 的实例。我认为 class 应该与 ndb 库一起使用,而不是遗留的 db-Model 但我还没有学习 ndb 并且我的模型相当复杂和引用。

class Video(db.Model):

  reference = db.ReferenceProperty(Item,
                                     collection_name='matched_videos', verbose_name='Title')
  content = blobstore.BlobReferenceProperty()
  title = db.StringProperty()
  filename = db.StringProperty()
  size = db.IntegerProperty()
  added = db.DateTimeProperty(verbose_name='added', auto_now_add=True)  # readonly

  def get_video(self,video_id):
    return Video.get_by_id(video_id)

然后当用户上传视频时,我只检查第一次上传的是不是视频,否则就是纯图片。我发现 appengine 可以存储 ogv 和 mp4 但不是所有视频格式。在我的代码中存储上传的视频如下所示。

 for upload in self.get_uploads():
        try:
            #logging.info(blobstore.blobstore.BlobInfo(upload.key()).content_type)

            content_type = blobstore.blobstore.BlobInfo(upload.key()).content_type

            if 'video' in content_type and not ad.hasvideo:
                vid = Video(reference=item)
                vid.content = upload.key()
                vid.title = blobstore.blobstore.BlobInfo(upload.key()).filename
                vid.size = blobstore.blobstore.BlobInfo(upload.key()).size

                tmp = upload.key()
                vid.put()
                item.hasvideo = True
                item.videos.append(upload.key())
            else:
                img = Image(reference=ad)
                img.primary_image = upload.key()

                img.put()
                item.hasimages = True
                item.image_url = images.get_serving_url(str(upload.key()), size=640)

                item.blobs.append(upload.key())

                item.put()
            counter = counter + 1
        except Exception, e:
            logging.error('There was an exception:%s' % str(e.message))
            pass

然后观看我使用此代码的视频。

class ViewVideo(BaseRequestHandler,blobstore_handlers.BlobstoreDownloadHandler):

  def get_video_content(self,content):
    query_str = "SELECT * FROM Video WHERE content =:content"
    return db.GqlQuery(query_str,content=content).get()

  def get(self):


    video_id = self.request.get('video_id')
    video_instance = None
    if video_id:
        video_instance = self.get_video_content(video_id)



        self.response.headers['Content-Type'] = blobstore.blobstore.BlobInfo(video_instance.content.key()).content_type

        self.send_blob(video_instance.content.key())

模型 item 是用户发布的项目的 class。现在我的问题是我是否应该重写它以使用 ndb 数据存储?我在 ndb 存在之前就开始了这个项目,我意识到使用 ndb 似乎更好,但是如果我的 Item class 也不是 ndb,我可以在 mndb 模型和非 ndb 模型之间进行引用还是必须同时迁移所有模型?

1) 停止使用 blobstore,并将您的视频放入 GCS(Google 云存储)存储桶中。

2) 将 GCD 视频的密钥存储在您的 ndb 模型中。其他属性很容易切换到ndb。