day89:luffy:使用Celery完成我的订单超时取消&Polyv视频加密
1.我的订单超时取消 2.PoliV视频播放
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
? ?
比如我们在课程详情页里面放的那个视频播放,是免费的,视频基本上就是一些课程介绍之类的。 为了保护我们的视频不容易被人剽窃,所以我们需要对视频进行加密传输,只有购买之后才能看到。保利威、又拍云、腾讯、网易都有视频的云存贮和云加密服务。 官方网址: 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.py |