购物车设计思路

先在redis测试

# Author:Jesi
# Time : 2018/10/25 18:36
import redis
import json
conn=redis.Redis(host="47.99.191.149",port=6379,password='cyy520')

# conn.flushall()
# #购买的第一商品
# data_dict={
#     11:{
#         'title':'21天从入门到放弃',
#         'src':'xxx.png'
#     }
# }
# conn.hset('luffy_shopping_car','11',json.dumps(data_dict))

# car = conn.hget('luffy_shopping_car','11')
# car_str=str(car,encoding='utf-8')
# car_dict=json.loads(car_str)
# print(car_dict)

# car_dict["12"]={
#         'title':'luffy_shopping_car',
#         'src':'xxx2.png'
#     }

# print(car_dict)
# print(conn.keys())
# conn.flushall()

#添加课程
# redis_key="luffy_shopping_car_%s_%s"%(6,12)
# conn.hmset(redis_key,{'title':'21天从入门到放弃','src':'xxx.png'})


#删除课程
# conn.delete('luffy_shopping_car_6_12')


#修改课程
# conn.hset('luffy_shopping_car_6_11','src','x1.png')


#查看所有课程
# print(conn.keys('luffy_shopping_car_6_*'))

# for item in conn.scan_iter('luffy_shopping_car_6_*',count=10):
#     course=conn.hgetall(item)
#     # print(course)
#     for k,v in course.items():
#         print(str(k,encoding='utf-8'),str(v,encoding='utf-8'))

正式开发购物车的接口:

因为购物车这种的有可能经常删除,修改等等,我们可以将这个东西放到redis中,速度更快,redis设置过期时间,如果长时间没有结算,那么应该把这个购物车清空。

1.添加URL

 url(r'shoppingcar/$',shoppingcar.ShoppingCarViewSet.as_view({'post':'create'}))

2.在redis配置上django的redis

#redis配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://47.99.191.149:6379",                #redis服务器地址
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},  #最大连接池100
            "PASSWORD": "xxxx",
        }
    }
}

3.新建一个py文件放购物车的类

# Author:Jesi
# Time : 2018/10/26 9:18
import json
import redis
from rest_framework.views import APIView
from rest_framework.viewsets import GenericViewSet,ViewSetMixin
from rest_framework.response import Response
from django_redis import get_redis_connection        #导入django_redis
from utils.response import BaseResponse              #导入状态信息基类
from api.views.auth.auth import LuffyAuth            #导入认证组件
from api import models                                
from django.core.exceptions import ObjectDoesNotExist
from utils.exception import PricePolicyInvalid       #自定制的价格策略非法异常
from django.conf import settings


class ShoppingCarViewSet(ViewSetMixin,APIView):
    authentication_classes = [LuffyAuth,]
    conn = get_redis_connection('default')  # 拿到defalut这个redis连接池

    def create(self,request,*args,**kwargs):
        '''
        将课程添加到购物车
        :param args:
        :param kwargs:
        :return:
        '''
        ret = BaseResponse()
        self.conn.set("name", "egon")
        try:
            #1.获取用户提交的课程ID和价格策略ID[这里注意int一下]
            course_id=int(request.data.get("courseid"))
            policy_id=int(request.data.get("policyid"))

            #2.获取专题课信息
            course=models.Course.objects.filter(id=course_id).first()

            #3.获取该课程相关的所有价格策略
            price_policy_list=course.price_policy.all()
            price_policy_dict={}                    #构建一个价格策略的字典。
            for item in price_policy_list:
                price_policy_dict[item.id]={
                    "period":item.valid_period,
                    "period_display":item.get_valid_period_display(),
                    "price":item.price
                }
            print(price_policy_dict)
       #{1: {'period': 3, 'period_display': '3天', 'price': 111.0}, 4: {'period': 30, 'period_display': '1个月', 'price': 399.0}}
#4.判断用户提交的价格策略是否合法 if policy_id not in price_policy_dict: #价格策略不合法 raise PricePolicyInvalid("价格策略不合法") #5.将购物信息添加到redis中 car_key=settings.SHOPPING_CAR_KEY%(request.auth.user_id,course_id) car_dict={ 'title':course.name, 'img':course.course_img, 'default_policy':policy_id, 'policy':json.dumps(price_policy_dict) #这里注意redis中需要将这里dumps一下才可以存入。 } conn=get_redis_connection("default") conn.hmset(car_key,car_dict) ret.data="添加成功!" except PricePolicyInvalid as e: #价格策略非法异常 ret.code=2001 ret.error=e.msg except ObjectDoesNotExist as e: #捕捉课程不存在的异常 ret.code = 2001 ret.error = "课程不存在" except Exception as e: ret.code=1001 ret.error="添加失败" return Response(ret.dict)

上面用到了一个认证的组件:

1.独立的认证组件,导入即可

LuffyAuth.py

from rest_framework.authentication import BaseAuthentication
from api import models
from rest_framework.exceptions import AuthenticationFailed

class LuffyAuth(BaseAuthentication):

    def authenticate(self, request):
        """
        用户请求进行认证
        :param request:
        :return:
        """
        # http://wwwww...c0ovmadfasd/?token=adfasdfasdf
        token = request.query_params.get('token')
        obj = models.UserAuthToken.objects.filter(token=token).first()
        if not obj:
            raise AuthenticationFailed({'code':1001,'error':'认证失败'})

        return (obj.user.username,obj)

2.上一个用的封装好的返回信息的基类,导入通用。

response.py

class BaseResponse(object):
    '''
    封装一个基础的字典
    '''
    def __init__(self):
        self.code = 1000
        self.data = None
        self.error = None
    @property
    def dict(self):
        return self.__dict__

3.exception.py

class PricePolicyInvalid(Exception):
    def __init__(self,msg):
        self.msg=msg

4.因为常用到这个redis的key,我们放到配置文件,业务中通过settings拿到直接用即可,不用一直写了。

settings.py

SHOPPING_CAR_KEY = "luffy_shopping_car_%s_%s"

 

最后在PY文件中测试一下,看一下redis到底存入了数据没有。

通过循环,拿到了购物车的数据,表示添加的接口开发完毕!

猜你喜欢

转载自www.cnblogs.com/geogre123/p/9855648.html