zoukankan      html  css  js  c++  java
  • day89:luffy:使用Celery完成我的订单超时取消&Polyv视频加密播放

    目录

    1.我的订单超时取消

    2.PoliV视频播放

    1.我的订单超时取消

    使用Celery完成超时取消功能

    mycelery/order/tasks.py

    from mycelery.main import app
    from order.models import Order
    import datetime
    from lyapi.settings import contains
    
    @app.task(name='cancle_order')
    def cancle_order():
        
        # 1.获取过期时间间隔(设置的是60s)
        expire_time = contains.ORDER_EXPIRE_TIME
        
        # 2.获取当前时间
        current_time = datetime.datetime.now()
        
        # 3.查询所有超时过期的订单
        '''订单超时的条件:下单时间 < 当前时间 - 过期间隔'''
        expire_order_list = Order.objects.filter(order_status=0,pay_time__lt=current_time - datetime.timedelta(seconds=expire_time))
    
        # 将超时订单的所有课程的状态改为3:超时取消
        for order in expire_order_list:
            order.order_status = 3
            order.save()

    constant.py

    # 订单超时时间间隔
    ORDER_EXPIRE_TIME = 60

    mycelery/config.py

    from celery.schedules import crontab
    from .main import app
    
    # 定时任务的调度列表,用于注册定时任务
    app.conf.beat_schedule = {
        
        # 每分钟查看订单状态
        'check_order_outtime': {
            
            # 本次调度的任务
            'task': 'cancle_order', # 这里的任务名称必须先到main.py中注册
            
            # 定时任务的调度周期
            # 'schedule': crontab(minute=0, hour=0),   # 每周凌晨00:00
            
            'schedule': crontab(),   # 每分钟
              # 'args': (16, 16),  # 注意:任务就是一个函数,所以如果有参数则需要传递
        },
    }

    mycelery/main.py

    # 注册任务[自动搜索并加载任务]
    app.autodiscover_tasks(['mycelery.sms','mycelery.order'])

    执行指令

    1.先在终端下,运行celery的定时任务程序,以下命令:

    celery -A mycelery.main beat

    2.然后再新建一个终端,运行以下命令,上面的命令必须先指定:

    celery -A mycelery.main worker --loglevel=info

    2.PoliV视频播放

    1.后端接口

    项目中有两种视频:收费视频[需要加密]和免费视频

    比如我们在课程详情页里面放的那个视频播放,是免费的,视频基本上就是一些课程介绍之类的。

    为了保护我们的视频不容易被人剽窃,所以我们需要对视频进行加密传输,只有购买之后才能看到。保利威、又拍云、腾讯、网易都有视频的云存贮和云加密服务。

    官方网址: http://www.polyv.net/vod/

    注意:

    开发时通过免费试用注册体验版账号【测试账号的测试有效期是一周】

    公司使用酷播尊享版 

    1.后端获取保利威的视频播放授权token,提供接口api给前端

    参考文档:http://dev.polyv.net/2019/videoproduct/v-api/v-api-play/create-playsafe-token/

    根据官方文档的案例,已经有其他人开源了,针对polvy的token生成的python版本了,我们可以直接拿来使用.

    lyapi/libs/polyv.py

    from django.conf import settings
    import time
    import requests
    # pip install requests
    import hashlib
    
    
    
    class PolyvPlayer(object):
        def __init__(self,userId,secretkey,tokenUrl):
            """初始化,提供用户id和秘钥"""
            self.userId = userId
            self.secretKey = secretkey
            self.tokenUrl = tokenUrl
    
        def tomd5(self, value):
            """取md5值"""
            return hashlib.md5(value.encode()).hexdigest()
    
        # 获取视频数据的token
        def get_video_token(self, videoId, viewerIp, viewerId=None, viewerName='', extraParams='HTML5'):
            """
            :param videoId: 视频id
            :param viewerId: 看视频用户id
            :param viewerIp: 看视频用户ip
            :param viewerName: 看视频用户昵称
            :param extraParams: 扩展参数
            :param sign: 加密的sign
            :return: 返回点播的视频的token
            """
            ts = int(time.time() * 1000)  # 时间戳
            plain = {
                "userId": self.userId,
                'videoId': videoId,
                'ts': ts,
                'viewerId': viewerId,
                'viewerIp': viewerIp,
                'viewerName': viewerName,
    
            }
    
            # 按照ASCKII升序 key + value + key + value... + value 拼接
            plain_sorted = {}
            key_temp = sorted(plain)
            for key in key_temp:
                plain_sorted[key] = plain[key]
            print(plain_sorted)
    
            plain_string = ''
            for k, v in plain_sorted.items():
                plain_string += str(k) + str(v)
            print(plain_string)
    
            # 首尾拼接上秘钥
            sign_data = self.secretKey + plain_string + self.secretKey
    
            # 取sign_data的md5的大写
            sign = self.tomd5(sign_data).upper()
    
            # 新的带有sign的字典
            plain.update({'sign': sign})
            
            # python 提供的发送http请求的模块
            result = requests.post(
                url=self.tokenUrl,
                headers={"Content-type": "application/x-www-form-urlencoded"},
                data=plain
            ).json()  #json.loads
            token = {} if isinstance(result, str) else result.get("data", {})
    
            return token

    dev.py

    POLYV_CONF = {
        'userid':'e42241e79c',
        'secretKey':'38MWu0xs0d',
        'tokenUrl':'https://hls.videocc.net/service/v1/token'
    
    }

    2.获取polyv token的后端接口

    course/urls.py

    from django.urls import path,re_path
    from . import views
    
    urlpatterns = [
        re_path(r'polyv/token/', views.PolyvView.as_view(),),
    ]

    course/views.py

    class PolyvView(APIView):
        # vid = '348e998797383060cb19620b1c600203_3'
        permission_classes = [IsAuthenticated, ]
        def get(self,request):
            polyv_obj = PolyvPlayer(settings.POLYV_CONF['userid'],settings.POLYV_CONF['secretKey'],settings.POLYV_CONF['tokenUrl'])
            vid = request.query_params.get('vid')
            viewerIp = request.META.get('REMOTE_ADDR')
            viewerId = request.user.id
            viewerName = request.user.username
    
            token_dict = polyv_obj.get_video_token(vid,viewerIp,viewerId,viewerName)
    
            return Response(token_dict)

    3.drf测试:course/polyv/token/?vid=e42241e79c63063c68fbd3de2cb01afc_e  可拿到token

    2.前端获取token

    Player.vue

    get_video_data(){
              let user_name = localStorage.username || sessionStorage.username;
            let token = localStorage.token || sessionStorage.token;
            console.log(this.$route.params.vid)
              let self = this;
            var player = polyvPlayer({
              wrap: '#player',
               document.documentElement.clientWidth - 300,
              height: document.documentElement.clientHeight,
              vid: this.$route.params.vid,
              // forceH5: true,
    
              // code: user_name,
              playsafe:  (vid, next) =>{
                console.log(self)
                self.$axios.get(`${self.$settings.Host}/course/polyv/token/?vid=${self.$route.params.vid}`,{
                  headers:{
                  'Authorization':'jwt ' + token
                  }
                }).then((res)=>{
                  // {‘token’:'asasfd'}
                  next(res.data.token);
    
                }).catch((error)=>{
    
                })

    index.html 引入js文件

    index.html

    <script src="//player.polyv.net/script/player.js"></script>

    课程详情页面选择章节课时开始学习跳转到视频页面

    Detail.vue

    <button class="try" v-if="lesson.free_trail"><router-link :to="'/polyv/player/'+lesson.section_link">立即学习</router-link></button>
  • 相关阅读:
    RabbitMQ学习之集群消息可靠性测试
    RabbitMQ学习之集群镜像模式配置
    (转)RabbitMQ学习之集群部署
    RabbitMQ学习之集群模式
    RabbitMQ学习之spring配置文件rabbit标签的使用
    RabbitMQ学习之messageconver插件实现(Gson)
    RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
    RabbitMQ学习之基于spring-rabbitmq的消息异步发送
    (转)RabbitMQ学习之spring整合发送异步消息(注解实现)
    范仁义js课程---16、非bool值的逻辑运算
  • 原文地址:https://www.cnblogs.com/libolun/p/13970017.html
Copyright © 2011-2022 走看看