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

2019-07-18 16:43:43 浏览数 (1)

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

0 人点赞