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
执行指令
1.先在终端下,运行celery的定时任务程序,以下命令:
celery -A mycelery.main beat
2.然后再新建一个终端,运行以下命令,上面的命令必须先指定:
celery -A mycelery.main worker --loglevel=info
比如我们在课程详情页里面放的那个视频播放,是免费的,视频基本上就是一些课程介绍之类的。
为了保护我们的视频不容易被人剽窃,所以我们需要对视频进行加密传输,只有购买之后才能看到。保利威、又拍云、腾讯、网易都有视频的云存贮和云加密服务。
官方网址: http://www.polyv.net/vod/
注意:
开发时通过
免费试用
注册体验版账号【测试账号的测试有效期是一周】公司使用酷播尊享版
根据官方文档的案例,已经有其他人开源了,针对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.pyPolyvView(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>