加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

day89:luffy:使用Celery完成我的订单超时取消&Polyv视频加密

发布时间:2020-12-20 09:59:44 所属栏目:Python 来源:网络整理
导读:目录 1.我的订单超时取消 2.PoliV视频播放 1.我的订单超时取消 使用Celery完成超时取消功能 mycelery/order/tasks.py from mycelery.main import app from order.models Order datetime from lyapi.settings contains@app.task(name = ' cancle_order ' ) de

目录

1.我的订单超时取消

2.PoliV视频播放

1.我的订单超时取消

使用Celery完成超时取消功能

mycelery/order/tasks.py

from mycelery.main import app
from order.models  Order
 datetime
from lyapi.settings  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  crontab
from .main  app

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

mycelery/main.py

 注册任务[自动搜索并加载任务]
app.autodiscover_tasks([mycelery.smsmycelery.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  settings
 time
 requests
 pip install requests
 hashlib



class PolyvPlayer(object):
    def __init__(self,userId,secretkey,tokenUrl):
        """初始化,提供用户id和秘钥"""
        self.userId = userId
        self.secretKey = secretkey
        self.tokenUrl = tokenUrl

     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,1)">ts: ts,1)">viewerId: viewerId,1)">viewerIp: viewerIp,1)">viewerName: viewerName,}

         按照ASCKII升序 key + value + key + value... + value 拼接
        plain_sorted = {}
        key_temp = sorted(plain)
        for key  key_temp:
            plain_sorted[key] = plain[key]
        print(plain_sorted)

        plain_string = ''
        for k,v  plain_sorted.items():
            plain_string += str(k) + str(v)
        (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':e42241e79csecretKey38MWu0xs0dtokenUrlhttps://hls.videocc.net/service/v1/token

}

2.获取polyv token的后端接口

course/urls.py

from django.urls  path,re_path
from .  views

urlpatterns = [
    re_path(rpolyv/token/course/views.py

 PolyvView(APIView):
     vid = '348e998797383060cb19620b1c600203_3'
    permission_classes = [IsAuthenticated,]
     get(self,request):
        polyv_obj = PolyvPlayer(settings.POLYV_CONF['],settings.POLYV_CONF[])
        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,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 = ;
        var player = polyvPlayer({
          wrap: '#player'.$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 ="try" v-if="lesson.free_trail"><router-link :to="'/polyv/player/'+lesson.section_link">立即学习</router-linkbutton>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读