先在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到底存入了数据没有。
通过循环,拿到了购物车的数据,表示添加的接口开发完毕!