前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-信息资讯-课程管理视图

Django实战-信息资讯-课程管理视图

作者头像
小团子
发布2019-07-18 16:43:43
3670
发布2019-07-18 16:43:43
举报
文章被收录于专栏:数据云团数据云团

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

对视频课程转码解密,视频内容上传到百度云,通过对视频转码加密,防止视频被下载。所以在视频播放前,需要获取后端传来的 token,然后再通过百度云的视频解析器来播放视频。

代码语言:javascript
复制
from django.shortcuts import render
import time, os, hmac, hashlib
from hashlib import md5
from django.shortcuts import reverse
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings
from .models import Course, CourseOrder
from utils import restful

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局

中间件 django.middleware.csrf.CsrfViewMiddleware

局部

@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便 settings 中没有设置全局中间件。

@csrf_exempt,取消当前函数防跨站请求伪造功能,即便 settings 中设置了全局中间件。

① 课程视频列表

代码语言:javascript
复制
def course_index(request):
    context = {
        'courses': Course.objects.all()
    }
    return render(request, 'course/course_index.html', context=context)

② 课程详情

代码语言:javascript
复制
def course_detail(request, course_id):
    course = Course.objects.get(pk=course_id)
    context = {
        'course': course,
        # 判断用户是否购买课程
        'buyed': CourseOrder.objects.filter(buyer=request.user, course=course, status=2).exists()
    }
    return render(request, 'course/course_detail.html', context=context)

② 生成解析视频的 token

需要在 settings.py 文件中添加百度云配置

代码语言:javascript
复制
# 百度云的配置
# 控制台 > 用户中心 > 用户ID
BAIDU_CLOUD_USER_ID = ''
# 点播VOD > 全局设置 > 发布设置 > 安全设置 > UserKey
BAIDU_CLOUD_USER_KEY = ''

HMAC需要一个加密用散列函数(表示为H)和一个密钥K。

假设H是一个将数据块用一个基本的迭代压缩函数来加密的散列函数。

用B来表示数据块的长。(以上说提到的散列函数的分割数据块长B=64),用L来表示散列函数的输出数据长(MD5中L=16,SHA—1中L=20)。

密钥的长度可以是小于等于数据块长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。

代码语言:javascript
复制
def course_token(request):
    # video 视频网址的完整链接
    video_url = request.GET.get('video_url')
    course_id = request.GET.get('course_id')
    # buyed = CourseOrder.objects.filter(course_id=course_id, buyer=request.user, status=2).exists()
    # if not buyed:
    #     return restful.params_error(message='请先购买课程!')
    # 设置视频过期时间
    expiration_time = int(time.time()) + 2 * 60 * 60
    USER_ID = settings.BAIDU_CLOUD_USER_ID
    USER_KEY = settings.BAIDU_CLOUD_USER_KEY

    extension = os.path.splitext(video_url)[1]
    media_id = video_url.split('/')[-1].replace(extension, '')
    # python unicode编码类型 转成encode
    key = USER_KEY.encode('utf-8')
    message = '/{0}/{1}'.format(media_id, expiration_time).encode('utf-8')
    signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest()
    token = '{0}_{1}_{2}'.format(signature, USER_ID, expiration_time)
    return restful.result(data={'token': token})
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档