基于django的视频点播网站开发-step9-后台视频管理功能...

news/2024/5/8 7:05:05/文章来源:https://blog.csdn.net/cpongo1/article/details/89543433

从本讲开始,我们开始视频管理功能的开发,视频管理包括视频上传、视频列表、视频编辑、视频删除。另外还有视频分类的功能,会一同讲解。这一讲非常重要,因为你将学习到一些之前没有学过的技术,比如大文件上传技术。

视频上传

我们先来实现视频的上传,视频的上传采用的是分块上传的策略,并用了分块上传类库:django_chunked_upload,使用该类库,再配合前端上传js库(jquery.fileupload.js),即可完美的实现文件的分块上传功能。

照例先编写添加视频的路由

添加视频,当然需要上传视频的页面,我们的页面是video_add路由来显示,通过urls .py中指定

path('video_add/', views.AddVideoView.as_view(), name='video_add'),

AddViewView仅仅用来显示上传页面,它的代码很简单

class AddVideoView(SuperUserRequiredMixin, TemplateView):template_name = 'myadmin/video_add.html'

只是继承了TemplateView来显示myadmin/video_add.html

myadmin/video_add.html中实现了上传视频的全过程,视频的上传采用的是分块上传的策略,前端使用的是js上传库(jquery.fileupload.js),后端使用的是django_chunked_upload,上传的逻辑是这样的:前端先选择一个文件,通过jquery.fileupload.js中的$.fileupload()方法来上传文件,后端接收到后分批返回已上传块的进度,前端根据进度来更新界面。由于上传前需要做一些校验的操作,代码较复杂,所以我们把上传的代码封装到了一个js中:static/js/myadmin/video_upload.js,主要的代码如下:


$("#chunked_upload").fileupload({url: api_chunked_uplad,dataType: "json",maxChunkSize: 100000, // Chunks of 100 kBformData: form_data,add: function(e, data) { // Called before starting uploadvar fileSize = data.originalFiles[0]['size'];var type = data.originalFiles[0]['type']; if(fileSize > 100000000){alert('文件太大了,请上传100M以内的文件');return;}if(!type.startsWith("video/")){alert('视频格式不正确');return;}form_data.splice(1);calculate_md5(data.files[0], 100000);  // Again, chunks of 100 kBdata.submit();$('#progress_label').on('click', false);$('#progress_layout').show()},chunkdone: function (e, data) { // Called after uploading each chunkif (form_data.length < 2) {form_data.push({"name": "upload_id", "value": data.result.upload_id});}var progress = parseInt(data.loaded / data.total * 100.0, 10);console.log(progress);if(progress > lastprogress){lastprogress = progress$('#upload_progress').progress({percent: progress});}},done: function (e, data) { // Called when the file has completely uploaded$.ajax({type: "POST",url: api_chunked_upload_complete,data: {csrfmiddlewaretoken: csrf,upload_id: data.result.upload_id,md5: md5},dataType: "json",success: function(data) {console.log(data)$('#upload_label').text('上传成功');$('#upload_progress').progress({percent: 100});$('#next_layout').show();$('#next').click(function(){window.location = '/myadmin/video_publish/' + data.video_id});}});},
});

在$.fileupload()方法中,有一个回调方法chunkdone(),该方法是用来更新进度的,告诉前端已经上传了多少字节。另外还有一个回调方法done(),该方法表示上传完毕,前端可在里面做一些额外的事情。

上传完毕后,调用了一个接口api_chunked_upload_complete,来给后端发送一个回执:我已上传完毕。

api_chunked_upload和api_chunked_upload_complete的路由是

path('chunked_upload/',  views.MyChunkedUploadView.as_view(), name='api_chunked_upload'),
path('chunked_upload_complete/', views.MyChunkedUploadCompleteView.as_view(),name='api_chunked_upload_complete'),

在MyChunkedUploadCompleteView中,我们在利用Video模型创建了这条视频

class MyChunkedUploadCompleteView(ChunkedUploadCompleteView):model = MyChunkedUploaddef get_response_data(self, chunked_upload, request):video = Video.objects.create(file=chunked_upload.file)return {'code': 0, 'video_id': video.id, 'msg': 'success'}

上传完毕效果如下

然后用户点击下一步,进入video_publish页面,开始发布前的资料填写

video_publish的路由是

path('video_publish/<int:pk>/', views.VideoPublishView.as_view(), name='video_publish'),

video_publish的视图类是VideoPublishView,它的代码如下

class VideoPublishView(SuperUserRequiredMixin, generic.UpdateView):model = Videoform_class = VideoPublishFormtemplate_name = 'myadmin/video_publish.html'def get_context_data(self, **kwargs):context = super(VideoPublishView, self).get_context_data(**kwargs)clf_list = Classification.objects.all().values()clf_data = {'clf_list':clf_list}context.update(clf_data)return contextdef get_success_url(self):return reverse('myadmin:video_publish_success')

对应的页面是myadmin/video_publish.html

就是下面这个页面

要填写的视频资料有视频标题、描述、分类、封面,

其中分类是通过get_context_data()带过来的,

填写后,点击发布,django将通过UpdateView自动为你更新视频信息。并通过get_success_url跳转到成功页面myadmin:video_publish_success,它的路由是

path('video_publish_success/', views.VideoPublishSuccessView.as_view(), name='video_publish_success'),

对应VideoPublishSuccessView是

class VideoPublishSuccessView(generic.TemplateView):template_name = 'myadmin/video_publish_success.html'

如下

我们点击视频列表即可查看视频

视频列表

视频列表的路由是

path('video_list/', views.VideoListView.as_view(), name='video_list'),

对应的视图类是VideoListView

class VideoListView(AdminUserRequiredMixin, generic.ListView):model = Videotemplate_name = 'myadmin/video_list.html'context_object_name = 'video_list'paginate_by = 10q = ''def get_context_data(self, *, object_list=None, **kwargs):context = super(VideoListView, self).get_context_data(**kwargs)paginator = context.get('paginator')page = context.get('page_obj')page_list = get_page_list(paginator, page)context['page_list'] = page_listcontext['q'] = self.qreturn contextdef get_queryset(self):self.q = self.request.GET.get("q", "")return Video.objects.get_search_list(self.q)

这里继承了ListView来显示视频列表,并通过get_queryset实现了搜索功能,通过get_context_data()实现了分页功能。

最后展示效果如下

你可能会发现,页面中还有编辑和删除的功能。编辑呢,是对单个视频对资料进行更新,删除即删除本条视频和视频文件。

视频编辑

我们先实现编辑功能,路由是

path('video_edit/<int:pk>/', views.VideoEditView.as_view(), name='video_edit'),

对应对视图类是VideoEditView,这个视图类是需要传递主键的。

class VideoEditView(SuperUserRequiredMixin, generic.UpdateView):model = Videoform_class = VideoEditFormtemplate_name = 'myadmin/video_edit.html'def get_context_data(self, **kwargs):context = super(VideoEditView, self).get_context_data(**kwargs)clf_list = Classification.objects.all().values()clf_data = {'clf_list':clf_list}context.update(clf_data)return contextdef get_success_url(self):messages.success(self.request, "保存成功")return reverse('myadmin:video_edit', kwargs={'pk': self.kwargs['pk']})

其实编辑页面和发布页面很相似,都是继承UpdateView视图类,并在get_context_data()里面传递分类信息。最终成功后通过messages.success(self.request, "保存成功")消息告之前端。

视频删除

删除功能就更加简单了。路由是

path('video_delete/', views.video_delete, name='video_delete'),

这里通过video_delete函数来实现,前端通过ajax(ajax代码位于static/js/myadmin/video_list.js)调用这个函数。

@ajax_required
@require_http_methods(["POST"])
def video_delete(request): video_id = request.POST['video_id']instance = Video.objects.get(id=video_id)instance.delete()return JsonResponse({"code": 0, "msg": "success"})

获取该视频,然后instance.delete()删除之。

视频分类

分类管理功能包括分类的增删改查。

增删改查的路由是

path('classification_add/', views.ClassificationAddView.as_view(), name='classification_add'),
path('classification_list/', views.ClassificationListView.as_view(), name='classification_list'),
path('classification_edit/<int:pk>/', views.ClassificationEditView.as_view(), name='classification_edit'),
path('classification_delete/', views.classification_delete, name='classification_delete'),

先来看分类添加的功能

分类添加是通过ClassificationAddView视图类来实现的,代码如下

class ClassificationAddView(SuperUserRequiredMixin, generic.View):def get(self, request):form = ClassificationAddForm()return render(self.request, 'myadmin/classification_add.html', {'form': form})def post(self, request):form = ClassificationAddForm(data=request.POST)if form.is_valid():form.save(commit=True)return render(self.request, 'myadmin/classification_add_success.html')return render(self.request, 'myadmin/classification_add.html', {'form': form})

此处是通过get和post一同来实现的,get()负责展示界面,post()负责逻辑判断。在post()中,直接调用form.save来保存记录,然后跳转到成功页myadmin/classification_add_success.html。

分类添加

添加成功

然后点击视频列表,即可查看列表,视频列表的视图类是ClassificationListView,即

class ClassificationListView(AdminUserRequiredMixin, generic.ListView):model = Classificationtemplate_name = 'myadmin/classification_list.html'context_object_name = 'classification_list'paginate_by = 10q = ''def get_context_data(self, *, object_list=None, **kwargs):context = super(ClassificationListView, self).get_context_data(**kwargs)paginator = context.get('paginator')page = context.get('page_obj')page_list = get_page_list(paginator, page)context['page_list'] = page_listcontext['q'] = self.qreturn contextdef get_queryset(self):self.q = self.request.GET.get("q", "")return Classification.objects.filter(title__contains=self.q)

继承ListView来显示列表,通过get_queryset()来实现搜索功能,通过get_context_data()来实现分页功能,通过template_name来指定模板

效果如下

接着来实现编辑和删除功能。

编辑对应的视图类是ClassificationEditView,它的实现超级简单,继承UpdateView即可。

class ClassificationEditView(SuperUserRequiredMixin, generic.UpdateView):model = Classificationform_class = ClassificationEditFormtemplate_name = 'myadmin/classification_edit.html'def get_success_url(self):messages.success(self.request, "保存成功")return reverse('myadmin:classification_edit', kwargs={'pk': self.kwargs['pk']})

编辑页面和添加页面很相似,这里就不贴图了。

最后是删除功能,是通过ajax来实现的,ajax代码位于static/js/myadmin/classification_list.js,在ajax中,通过调用删除接口classification_delete来实现删除功能,

接口classification_delete的代码:

@ajax_required
@require_http_methods(["POST"])
def classification_delete(request):classification_id = request.POST['classification_id']instance = Classification.objects.get(id=classification_id)instance.delete()return JsonResponse({"code": 0, "msg": "success"})

功能略多,同学们可根据自身情况,根据后台demo地址的演示来一步步学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_736963.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dedecms网站被黑 劫持到其他网站如何解决

前段时间网站被黑了&#xff0c;从百度打开网站直接被劫持跳转到了cai票&#xff0c;du博网站上去&#xff0c;网站的首页index.html文件也被篡改成一些什么北京sai车&#xff0c;pk10&#xff0c;一些cai票的关键词内容&#xff0c;搞得网站根本无法正常浏览&#xff0c;从百度…

基于django的视频点播网站开发-step13-后台反馈功能...

用户反馈管理功能&#xff0c;是对前端用户反馈的问题进行展示&#xff0c;并可实现删除功能。是一个很实用的功能&#xff0c;也算是当代网站的标配。它可以实时的跟踪到用户对网站的各种意见和吐槽&#xff0c;开发者能及时修缮网站功能或者修改网站bug。 Demo地址 反馈管理包…

基于django的视频点播网站开发-step14-数据总览功能...

数据总览功能&#xff0c;是对网站中产生的数据进行一个统计&#xff0c;统计出视频数、发布数、用户数、评论数&#xff0c;等等。让管理者对网站数据有一个清晰的认识&#xff0c;做到心中有数。 在本站中&#xff0c;笔者一共列举了下面几种数据&#xff1a;视频数、发布中未…

域名备案后,有必要做个网站吗?为了不掉备案,很有必要!...

今天突然一个同学找我咨询阿里云网站备案问题。说是收到了这样一封来自阿里云的邮件&#xff1a; 原因很简单&#xff0c;他当时有台短期服务器&#xff0c;还有个域名&#xff0c;就做了网站备案。虽然一直没有实际制作网站发布&#xff0c;但是网站毕竟做完了备案工作。 再说…

SEO人员,如何辨别流量与相关性的罗生门?

对于SEO人员而言&#xff0c;我们在做企业产品的时候&#xff0c;经常会遇到这样一个问题&#xff0c;那就是关于相关性与流量的问题&#xff0c;这经常是SEOer&#xff0c;陷入罗生门的死角&#xff0c;而不能自知。 而实际上&#xff0c;它在企业产品转化&#xff0c;提高利润…

JAVA中医药查询系统,基于jsp的中医药教育网站-JavaEE实现中医药教育网站 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的中医药教育网站, 该项目可用各类java课程设计大作业中, 中医药教育网站的系统架构分为前后台两部分, 最终实现在线上进行中医药教育网站各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类中医药教育网站相…

SEO人员,该如何寻找高价值的关键词?

对于企业SEO而言&#xff0c;每个站点都需要更多的自然流量&#xff0c;为了得到它&#xff0c;你可能需要对关键词排名&#xff0c;有的时候&#xff0c;为了获得更加精准的流量与提高产品转化率。 在选择关键词的时候&#xff0c;我们不得不&#xff0c;花费更多的时间&…

阿里云快速搭建 WordPress 个人网站

创建服务器 登录轻量应用服务器控制台&#xff0c;点击页面右上方的 创建服务器。在弹出的页面上&#xff0c;为列出的各选项做出选择&#xff0c;可同时领取阿里云优惠劵 点击 立即购买。浏览订单详情&#xff0c;确认无误后&#xff0c;点击 去支付。点击 确认支付。点击 进入…

百度又摊上大事!百科外链指向色情网站

百度回复已经第一时间进行了处理排查。 继百度百家风波后&#xff0c;百度再次被推上风口浪尖&#xff0c;这次中招的则是百度百科。昨日晚间&#xff0c;有自媒体爆料称在百度搜索部分小学和幼儿园&#xff0c;进入百度百科页面后&#xff0c;最底部的参考网站最终会指向色情…

php调用会员头像,phpcms v9模版如何调用会员头像_CMS系统建站教程

phpcms v9无法安装怎么办_CMS系统建站教程phpcms v9无法安装是因为表前缀有特殊符号&#xff0c;其解决办法&#xff1a;首先进入phpcms v9安装界面&#xff1b;然后将数据表前缀修改为“phpcmsv9”&#xff1b;接着填写正确的管理员账号信息即可。phpcms v9模版如何调用会员头…

分享五个免费图片/视频资源网站

分享几个曾今用到的图片/视频资源站点&#xff0c;我的App或网站资源基本来自这些网站... Ignite Motion ignitemotion.itlao5.com.jpgIgnite Motion提供了许多不同分类的免费视频资源&#xff0c;而且不限制商用。如果需要为你的网站或者App挑选一款炫酷的背景动画&#xff0c…

网站怎么接入高防服务器,[网站防护步骤 1] HTTP网站接入/接入网站

1. 登录恒创科技会员中心&#xff0c;在 “高防 IP” 管理页面&#xff0c;登录 “自服务平台”。2. 点击进入左侧导航栏 “网站业务”。3. 点击 “添加域名”。4. 填写域名信息&#xff0c;以及需要防护的网站信息。•域名&#xff1a;填写需要配置防护的网站域名。支持顶级域…

网站架构的逐步优化演变

一&#xff1a;建站之初 *建站之初&#xff0c;站点流量非常小&#xff0c;可能低于十万级别。这意味着&#xff0c;平均每秒钟也就几次访问。请求量比较低&#xff0c;数据量比较小&#xff0c;代码量也比较小&#xff0c;几个工程师&#xff0c;很短的时间搭起这样的系统&…

可视化编辑网站模板拖拽式建站源码_模板建站缘何这么流行?

伴随着互联网技术的迅速发展&#xff0c;各式各样的平台网站层出不穷。网站模板变成企业建站的一部分&#xff0c;不仅是自身方便快捷的功能&#xff0c;更是未来发展前景的促进。网站模板就是网页模板&#xff0c;这里比较突出的当属开创者素材了&#xff0c;它采用网站制作软…

bootstrap下拉框选择没反应_SEO工具脚本,Python百度下拉框关键词采集工具

对于词的研究&#xff0c;想必每个seoer都知道&#xff0c;而除了比较热门的百度相关搜索词之外&#xff0c;百度下拉框关键词应该也是不少人研究的范围&#xff0c;不过大部分人都是针对下拉框词的刷量&#xff0c;毕竟百度下拉框关键词采集已经泛滥成灾了。百度下拉的官方正式…

服务器购买网站vuter,vscode中安装开发html5中需要的插件

vscode中安装开发html5中需要的插件vscode中安装开发html5中需要的插件最近在学习H5&#xff0c;也开始尝试着用vscode来写h5的代码。vscode是一个很不错的剪辑器&#xff0c;已经用它来写过php&#xff0c;python&#xff0c;还有vue的代码了。最近使用它写H5的代码&#xff0…

xampp配置PHP配置端口,【PHP】xampp配置多个监听端口和不同的网站目录(转)

windows下使用xampp配置多个监听端口和不同的网站目录一&#xff1a;配置Apache文件httpd.conf打开Apache的配置文件httpd.conf&#xff0c;可以通过点击xampp的Apache的config下的Apache(httpd.conf)打开。首先在Listen 80下面添加监听端口如Listen 8001Listen 8002然后在http…

css background-image 高度自适应_打造自适应网站只用一个CSS属性就够了

用一个CSS属性创建一个响应式网站&#xff0c;让我们来看看它是如何做到的。 以这个模板为例&#xff0c;没有应用css属性。 使用 clamp() CSS函数&#xff0c;我们可以创建仅具有一个属性的响应式网站。现在添加魔术CSSclamp(minimum, preferred, maximum);在这里&#xff01;…

打开是什么样子的图片_3个在线设计效果图网站,可以把图片生成网页扁平网页模板...

点击上方“字体传奇”→点右上角“...”→点选“设为星标★找到3个在线设计效果图网站&#xff0c;可以把图片生成网页扁平网页模板&#xff0c;在网站内上传一张图片&#xff0c;可以生成好几个不同风格的浏览器页面&#xff0c;照片等风格&#xff0c;背景色彩都是可以自定义…

论好用的云主机对于网站运营的重要性

网站的运营对于企业来说&#xff0c;其重要性是不必多言的&#xff0c;不管是企业还是个人&#xff0c;网搭建好后&#xff0c;只有很好地运营起来才能带来收益。既然后期的网站运营对于企业或个人网站来说如此重要&#xff0c;那影响网站后期运营的重要因素又有哪些呢&#xf…