day89:luffy:使用Celery完成我的订单超时取消&Polyv视频加密播放
2020-11-13 16:26
288 查看
目录
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', width: 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>
相关文章推荐
- WebView&HTML5-----使用WebView播放HTML5视频文件
- Unity3D使用WWW类和协程完成图片、视频下载播放
- Unity如何使用WWW类和协程完成图片、视频下载播放(一)
- Unity如何使用WWW类和协程完成图片、视频下载播放
- 完成的一个android视频加密解密播放的案例
- 使用SurfaceView+Medaplayer+SeekBar完成视频的播放加进度条
- 关于使用Html <audio>标签播放视频文件的问题
- <车载物联网项目,视频采集传输部分,第三天> 使用ffserver输出视频文件流,并且使用使用命令行终端播放视频文件
- HTML5 - 使用<video>播放视频
- 【未完后补】cordova&ionic使用视频播放插件videogular
- 使用AVPro Video插件完成切换多个视频播放功能
- Unity如何使用WWW类和协程完成图片、视频下载播放
- Java 使用blob对H5视频播放进行加密《java视频加密》
- polyv的播放小程序视频sdk以及加密方式
- 使用Timer,TimerTask完成播放视频点击显示控制台
- <车载物联网项目,视频采集传输部分,第二天> 使用ffserver输出视频文件流,并且使用使用命令行终端播放视频文件
- 使用SurfaceView&MediaPlayer播放视频
- D3D下使用VMR9播放视频文件
- D3D下使用VMR9播放视频文件
- iphone 视频播放使用