网站上视频播放,购物车接口
文章目录
一,网站视频播放
第一步:申请cc视频
第二步,上传视频内容(可以设置视频窗口格式和时间)
第三步:把视频穿个后面的html代码复制到想要播放视频的文档即可
二,购物车接口
思路解析:
首先加入购物车都是在登录的基础上,所以首先要写一个认证组件(注意认证成功的返回值是用户信息和认证结果)认证失败抛异常
from rest_framework.authentication import BaseAuthentication
from api import models
from rest_framework.exceptions import AuthenticationFailed
class LoginAuth(BaseAuthentication):
def authenticate(self, request):
token = request.GET.get('token')
ret = models.UserToken.objects.filter(token=token).first()
if ret:
# 有值说明认证通过,返回两个值
return ret.user, ret
else:
raise AuthenticationFailed('认证失败,没有登录')
考虑数据要写再redis里面方便,所以养配置redis环境:实例化产生一个对象:conn = get_redis_connection()
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 1000}
# "PASSWORD": "123",
}
}
}
然后就开始对购物车进行增删改查
考虑存入redis的格式,因为Key是唯一的,防止冲突,直接(shopping_用户id)命名,对应的value值是json格式字典
key是课程id,value是对应的课程信息,且包含价格策略字典{key为价格策略的id}
(一)添加购物车
第一步:添加购物车需要携带课程的id和价格策略的id,请求接口需要把两个id取出来,接着取出该客户才能与对应的所有价格策略,然后redis购物车中取出该用户的购物车
这里的介个策略id,是为了设置价格策略的默认值
第二步:判断购物车是否存在,如果不存在,则创建一个空购物车,如果存在,则把json格式反序列化成字典赋值为购物车
第三步:循环构造出价格策略的字典(防止是恶意攻击,判断价格策略的Id是否存在字典中)不存在直接抛出异常
第四步:判断课程的id是否存在购物车中,如果存在更新价格策略的默认值,不存在则添加在购物车里面,写入redis
下面是捕获上面抛出的异常,为了方便,自己写一个异常,返回异常信息和状态值(除了不存在和未知异常)
自定义异常信息
from django.utils.deprecation import MiddlewareMixin
class MyCorsMiddle(MiddlewareMixin):
def process_response(self,request,response):
# 简单请求:
# 允许http://127.0.0.1:8001域向我发请求
# ret['Access-Control-Allow-Origin']='http://127.0.0.1:8001'
# 允许所有人向我发请求
response['Access-Control-Allow-Origin'] = '*'
if request.method == 'OPTIONS':
# 所有的头信息都允许
response['Access-Control-Allow-Headers'] = '*'
return response
添加购物车
class ShoppingCart(APIView):
authentication_classes = [LoginAuth]
conn = get_redis_connection()
def post(self, request, *args, **kwargs):
response = MyResponse()
# 课程id,价格策略id
# {"course_id": "1", "policy_id": "1"}
# 放到redis中key值 shoppingcart_userid_courseid
# 0 取出课程id,价格策略id
course_id = str(request.data.get('course_id'))
policy_id = str(request.data.get('policy_id'))
# 1 校验课程是否合法
try:
course = models.Course.objects.get(pk=course_id)
# 2 获取所有价格策略(通过课程拿出所有价格策略)
policy_price_all = course.price_policy.all()
# 3 从redis中取出当前登录用户的购物车
shopping_byte = self.conn.get('shoppingcart_%s' % request.user.pk)
if shopping_byte:
shopping_cart = json.loads(shopping_byte)
else:
shopping_cart = {}
# 循环构造出价格策略大字典
policy = {}
for policy_price in policy_price_all:
'''
{
"period":3,
"period_display":"3天",
"price":200
},
'''
policy_one = {
'period': policy_price.pk,
'period_display': policy_price.get_valid_period_display(),
'price': policy_price.price
}
policy[str(policy_price.pk)] = policy_one
# 判断价格策略是否合法,不再字典中,就不合法
if policy_id not in policy:
# 不合法
raise CommonException(102, '价格策略不合法,你不是人')
# 判断传入的课程id是否在购物车中
if course_id in shopping_cart:
# 更新一下默认价格策略
shopping_cart[course_id]['default_policy'] = policy_id
response.msg = '更新成功'
else:
shopping_course = {
'title': course.name,
'img': course.course_img,
'default_policy': policy_id,
'policy': policy
}
# 添加到购物车
shopping_cart[course_id] = shopping_course
response.msg = '添加成功'
# 写入redis
self.conn.set('shoppingcart_%s' % request.user.pk, json.dumps(shopping_cart))
except ObjectDoesNotExist as e:
response.status = 101
response.msg = '该课程不存在,你可能是爬虫'
except CommonException as e:
response.status = e.status
response.msg = e.msg
except Exception as e:
response.status = 400
response.msg = '未知错误'
print(str(e))
return Response(response.get_dic)
(二)修改购物车
第一步:添加购物车需要携带课程的id和价格策略的id,请求接口需要把两个id取出来,然后redis购物车中取出该用户的购物车
这里的介个策略id,是为了设置价格策略的默认值
第二步:判断购物车是否存在,如果不存在,则创建一个空购物车,如果存在,则把json格式反序列化成字典赋值为购物车
第三步:判断课程是否在购物车里面:如果不存在(抛异常),存在,则把课程的具体信息取出
第四步:判断介个策略是否在该课程里,如果存在,则修改写入redis即可
修改购物车信息
def put(self,request,*args,**kwargs):
response=MyResponse()
# 0 取出课程id,价格策略id
course_id = str(request.data.get('course_id'))
policy_id = str(request.data.get('policy_id'))
try:
shopping_byte = self.conn.get('shoppingcart_%s' % request.user.pk)
if shopping_byte:
shopping_cart = json.loads(shopping_byte)
else:
shopping_cart = {}
if course_id not in shopping_cart:
raise CommonException(102,'要修改的课程不存在')
course_detail=shopping_cart.get(course_id)
if policy_id not in course_detail['policy']:
raise CommonException(103, '价格策略不合法')
course_detail['default_policy']=policy_id
response.msg='修改成功'
self.conn.set('shoppingcart_%s' % request.user.pk, json.dumps(shopping_cart))
except ObjectDoesNotExist as e:
response.status = 101
response.msg = '该课程不存在,你可能是爬虫'
except CommonException as e:
response.status = e.status
response.msg = e.msg
except Exception as e:
response.status = 400
response.msg = '未知错误'
print(str(e))
return Response(response.get_dic)
(三)查和删除购物车信息
def get(self,request,*args,**kwargs):
response=MyResponse()
try:
shopping_byte = self.conn.get('shoppingcart_%s' % request.user.pk)
if shopping_byte:
shopping_cart = json.loads(shopping_byte)
else:
shopping_cart = {}
response.data=shopping_cart
except Exception as e:
response.status = 400
response.msg = '未知错误'
print(str(e))
return Response(response.get_dic)
def delete(self, request, *args, **kwargs):
response=MyResponse()
course_id=request.data.get('course_id')
try:
shopping_byte = self.conn.get('shoppingcart_%s' % request.user.pk)
if shopping_byte:
shopping_cart = json.loads(shopping_byte)
else:
shopping_cart = {}
shopping_cart.pop(course_id,None)
self.conn.set('shoppingcart_%s' % request.user.pk, json.dumps(shopping_cart))
except Exception as e:
response.status = 400
response.msg = '未知错误'
print(str(e))
return Response(response.get_dic)