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})