专栏首页数据云团Django实战-信息资讯-课程管理视图

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

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

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

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 中设置了全局中间件。

① 课程视频列表

def course_index(request):
    context = {
        'courses': Course.objects.all()
    }
    return render(request, 'course/course_index.html', context=context)

② 课程详情

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 文件中添加百度云配置

# 百度云的配置
# 控制台 > 用户中心 > 用户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中实际使用的密钥。

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

本文分享自微信公众号 - 数据云团(SmartData),作者:云团小楠

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Django实战-信息资讯-UEditor富文本编辑器

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

    小团子
  • 第一季 | serializers 还有哪些操作没试过

    Django REST框架构建Web API。Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编...

    小团子
  • Django源码学习-7-View 视图函数

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

    小团子
  • mybatis中crud操作范例

    1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybat...

    Gxjun
  • SpringBoot解析Excel

    现在很多web应用中,导入excel导出excel很常见,这篇文章就讲讲导入excel文件。

    秃头哥编程
  • 『高级篇』docker之开发课程EdgeService(16)

    PS:微服务跟之前说的一样就是互相通过RPC的方式进行通信,之间有自己的数据库,只是RPC暴露接口的方式来获取其他的微服务之间的数据。

    IT故事会
  • 『高级篇』docker之开发课程EdgeService(16)

    PS:微服务跟之前说的一样就是互相通过RPC的方式进行通信,之间有自己的数据库,只是RPC暴露接口的方式来获取其他的微服务之间的数据。

    IT故事会
  • Android四大组件之一Service

    以上就是实现IntentService类所需要的全部操作:无参构造方法和onHandleIntent()方法

    提莫队长
  • 谋定数字化+云化+AI化-腾讯程武:经信研究数字故宫建设

    (肖春芳)光明网讯  新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 万赢信采编:从表情包、漫画、音乐、小游戏到玩转故宫的小程...

    经济和信息化研究中心
  • Hadoop视频教程汇总

    一 慕课网 1.Hadoop大数据平台架构与实践--基础篇(已学习) 链接:https://www.imooc.com/learn/391 2.Hadoop进阶...

    庞小明

扫码关注云+社区

领取腾讯云代金券