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>
  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/libolun/p/13970017.html
Copyright © 2011-2022 走看看