网站上视频播放,购物车接口

一,网站视频播放

第一步:申请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格式字典

1545996498093在这里插入图片描述

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)

猜你喜欢

转载自blog.csdn.net/qq_42737056/article/details/85330818