day89:luffy:使用Celery完成我的订单超时取消&Polyv视频加密播放
目录
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>
day89:luffy:使用Celery完成我的订单超时取消&Polyv视频加密播放的更多相关文章
- PHP【Laravel】delayer基于redis的实现订单超时改变状态
实现这个功能前你需要知道以下,不然可能会比较吃力:1.服务器的计划任务,shell脚本,或者你有宝塔自带的计划任务会方便很多.2.有所了解Redis.3.会写PHP业务逻辑. 好了进入在正题,这里使用 ...
- RabbitMQ实现订单超时案例
前言 人间清醒 目录 前言 业务场景 JUC(DelayQueue)方案 DelayQueue简介 JUC DelayQueue实现订单超时案例代码 案例代码 Redis Key过期事件方案 简介 R ...
- 1.1XAF框架开发视频教程-简单的订单管理实现过程,视频,提纲,及教程源码
下面是视频教程的提纲: PPT版本的提纲下载 本节源码下载 XAF框架开发教程 快速实现企业级信息系统开发的利器 XAF简介 ´ 开发公司:www.devexpress.com,老牌控件公司 ´ ...
- BotVS开发基础—2.4 获取订单、取消订单、获取未完成订单
代码 RetryDelay = 1500; def CancelPendingOrders(exch, orderType): # 取消所有未完成的挂单, 参数1 交易所 参数2 类型 global ...
- 订单超时、活动过期解决方案:php监听redis key失效触发回调事件
Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0.0 版本之后的 SUBSCRIBE 就能完成这个定时任务的操作了,定时的 ...
- 分布式消息队列XXL-MQ
<分布式消息队列XXL-MQ> 一.简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行.并行和广播等多种消息模型.现已开放源代码,开箱即用. 支持三种消息模式: ...
- vue使用案例,vue初始化,vue初始化方法,vue条件语句,vue在js里面添加元素调用vue方法
<div id="main" > <button id='but1' type="button" v-on:click="save ...
- 聊聊多线程那一些事儿(task)之 三 异步取消和异步方法
hello,咋们又见面啦,通过前面两篇文章的介绍,对task的创建.运行.阻塞.同步.延续操作等都有了很好的认识和使用,结合实际的场景介绍,这样一来在实际的工作中也能够解决很大一部分的关于多线程的业务 ...
- 聊聊多线程哪一些事儿(task)之 三 异步取消和异步方法
hello,咋们又见面啦,通过前面两篇文章的介绍,对task的创建.运行.阻塞.同步.延续操作等都有了很好的认识和使用,结合实际的场景介绍,这样一来在实际的工作中也能够解决很大一部分的关于多线程的业务 ...
随机推荐
- 基于Intel x86 Android的RAD游戏开发
zip文件还包含编译的"MonkeyGame-debug".可以在模拟器中运行的二进制文件.在"game.build"文件夹中有一个HTML5 build.在C ...
- JVM性能调优(3) —— 内存分配和垃圾回收调优
前序文章: JVM性能调优(1) -- JVM内存模型和类加载运行机制 JVM性能调优(2) -- 垃圾回收器和回收策略 一.内存调优的目标 新生代的垃圾回收是比较简单的,Eden区满了无法分配新对象 ...
- SQL学习 小知识点(一)
这是我在做实验的时候总结的,随着学习可能会做更多的小总结 ssms上面把所有代码写下来后一块执行是行不通的(极大可能会报错),推测可能是因为ssms先对代码的语法进行了检查. --My expe ...
- 关于pipeline的一篇转载博文https://www.cnblogs.com/midhillzhou/p/5588958.html
引用自https://www.cnblogs.com/midhillzhou/p/5588958.html 1.pipeline的产生 从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客 ...
- 打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),写出来真是泪牛满面啊。
本程序可以完美输出,效果如下: 相信你已经很期待代码实现了吧,其实代码真的不难,关键是思想.我说说我的想法吧,首先我构造了一个数组,保存了上面图片中字符一行的一半.聪明的你肯定看出来了,上面多数字符都 ...
- pytest文档48-切换 base_url 测试环境(pytest-base-url)
前言 当我们自动化代码写完成之后,期望能在不同的环境测试,这时候应该把 base_url 单独拿出来,能通过配置文件和支持命令行参数执行. pytest-base-url 是 pytest 里面提供的 ...
- sublime text2的插件
编写html代码,一定要使用emmet(前身是zencoding),还有以下插件也是可以考虑的:bracketHighter 高亮引号.括号等code Aligment 代码对齐DocBlockr 如 ...
- kafka生产者 消费者
publisher.php <?php $rk = new RdKafka\Producer(); $rk->addBrokers("192.168.33.50"); ...
- linux(centos8):安装Jenkins持续集成工具(java 14 / jenkins 2.257)
一,什么是Jenkins? 1,jenkins是什么? Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具, 用于监控持续重复的工作,旨在提供一个开放易用的软件平台, 使软件的持续 ...
- 第十一章 LNMP架构基础介绍
一.LNMP架构 1.简介 oLNMP是一套技术的组合,L=Linux.N=Nginx.M~=MySQL.P~=PHP不仅仅包含这些,还有redis/ELK/zabbix/git/jenkins/ka ...