视频模型和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。
在 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。