1 class CourseModelSerializer(serializers.ModelSerializer): 2 class Meta: 3 model=Course 4 fields="__all__" 5 level=serializers.CharField(source="get_level_display") 6 coursedetail_id=serializers.IntegerField(source="coursedetail.id")
1 class CoursesView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView): 2 queryset = Course.objects.all() 3 serializer_class = CourseModelSerializer 4 def get(self, request, *args, **kwargs): 5 response=self.list(self, request, *args, **kwargs) 6 response["Access-Control-Allow-Origin"] = "*" 7 response["Access-Control-Allow-Headers"] = "Content-Type" 8 return response
课程接口数据结构
1 [ 2 { 3 "id": 1, 4 "level": "初级", 5 "coursedetail_id": 1, 6 "name": "Python开发21天入门", 7 "course_img": "https://hcdn1.luffycity.com/static/frontend/course/5/21%E5%A4%A9_1544059695.5584881.jpeg", 8 "course_type": 0, 9 "brief": "Python开发21天入门的课程概述", 10 "pub_date": "2018-12-01", 11 "period": 7, 12 "order": 1, 13 "attachment_path": null, 14 "status": 0 15 }, 16 { 17 "id": 2, 18 "level": "中级", 19 "coursedetail_id": 2, 20 "name": "Linux系统基础五周精讲", 21 "course_img": "https://hcdn1.luffycity.com/static/frontend/course/12/Linux_1544069008.0915537.jpeg", 22 "course_type": 1, 23 "brief": "Linux系统基础五周精讲的课程概述", 24 "pub_date": "2018-12-02", 25 "period": 5, 26 "order": 2, 27 "attachment_path": null, 28 "status": 0 29 }, 30 { 31 "id": 3, 32 "level": "高级", 33 "coursedetail_id": 3, 34 "name": "Django入门与实践", 35 "course_img": "https://hcdn1.luffycity.com/static/frontend/course/42/git-pc%E5%88%97%E8%A1%A8_1544420927.8406003.jpeg", 36 "course_type": 2, 37 "brief": "Django入门与实践的课程概述", 38 "pub_date": "2018-12-03", 39 "period": 23, 40 "order": 3, 41 "attachment_path": null, 42 "status": 0 43 } 44 ]
1 class CourseDetailModelSerializer(serializers.ModelSerializer): 2 class Meta: 3 model=CourseDetail 4 fields="__all__" 5 name=serializers.CharField(source="course.name") 6 prices=serializers.SerializerMethodField() 7 teachers=serializers.SerializerMethodField() 8 brief=serializers.CharField(source="course.brief") 9 stay_all_time=serializers.CharField(source="hours") 10 level=serializers.CharField(source="course.get_level_display") 11 teachers_info=serializers.SerializerMethodField() 12 is_online=serializers.CharField(source="course.get_status_display") 13 recommend_coursesinfo=serializers.SerializerMethodField() 14 def get_teachers(self,coursedetail_obj): 15 s="" 16 for obj in coursedetail_obj.teachers.all(): 17 s=s+obj.name 18 return s 19 def get_prices(self,coursedetail_obj): 20 price_policy_queryset=coursedetail_obj.course.price_policy.all() 21 print(price_policy_queryset) 22 return [{"price":price_policy.price,"valid_period":price_policy.get_valid_period_display()} for price_policy in price_policy_queryset] 23 def get_teachers_info(self,coursedetail_obj): 24 teachers_queryset=coursedetail_obj.teachers.all() 25 return [{"name":teacher.name,"brief":teacher.brief,"image":teacher.image} for teacher in teachers_queryset] 26 def get_recommend_coursesinfo(self,coursedetail_obj): 27 recommend_courses_queryset=coursedetail_obj.recommend_courses.all() 28 return [{"name": recommend_courses.name, "pk": recommend_courses.pk} for recommend_courses in recommend_courses_queryset]
1 class CourseDetailView(mixins.RetrieveModelMixin,generics.GenericAPIView): 2 queryset = CourseDetail.objects.all() 3 serializer_class = CourseDetailModelSerializer 4 def get(self, request, *args, **kwargs): 5 response=self.retrieve(self, request, *args, **kwargs) 6 response["Access-Control-Allow-Origin"] = "*" 7 response["Access-Control-Allow-Headers"] = "Content-Type" 8 return response
课程详情接口数据结构
1 { 2 "id": 1, 3 "name": "Python开发21天入门", 4 "prices": [ 5 { 6 "price": 100, 7 "valid_period": "1个月" 8 }, 9 { 10 "price": 200, 11 "valid_period": "2个月" 12 }, 13 { 14 "price": 300, 15 "valid_period": "3个月" 16 } 17 ], 18 "teachers": "alex", 19 "brief": "Python开发21天入门的课程概述", 20 "stay_all_time": "7", 21 "level": "初级", 22 "teachers_info": [ 23 { 24 "name": "alex", 25 "brief": "alex的Brief", 26 "image": "https://hcdn1.luffycity.com/static/frontend/course/46/Zabbiix-pc%E5%88%97%E8%A1%A8_1544431586.4417293.jpeg" 27 } 28 ], 29 "is_online": "上线", 30 "recommend_coursesinfo": [ 31 { 32 "name": "Linux系统基础五周精讲", 33 "pk": 2 34 } 35 ], 36 "hours": 7, 37 "course_slogan": "Python开发21天入门的Course slogan", 38 "video_brief_link": "Python开发21天入门的Video brief link:", 39 "why_study": "Python开发21天入门的学习原因", 40 "what_to_study_brief": "Python开发21天入门的学习内容", 41 "career_improvement": "Python开发21天入门的此项目如何有助于我的职业生涯:", 42 "prerequisite": "Python开发21天入门的先修要求", 43 "course": 1, 44 "recommend_courses": [ 45 2 46 ] 47 }
1 class LoginView(APIView): 2 def post(self,request): 3 user=request.data.get("user") 4 pwd=request.data.get("pwd") 5 user_obj=authenticate(username=user,password=pwd) 6 res={"user": None, "msg": None} 7 if user_obj: 8 random_str=uuid.uuid4() 9 Token.objects.update_or_create(user=user_obj,defaults={"key":random_str,"created":datetime.datetime.now()}) 10 res["user"]=user_obj.username 11 res["token"]=random_str 12 else: 13 res["msg"]="用户名或密码错误" 14 return Response(res)
1 class AuthUser(BaseAuthentication): 2 def authenticate(self, request): 3 token=request.META.get("HTTP_AUTHORIZATION") 4 token_obj=Token.objects.filter(key=token).first() 5 if not token_obj: 6 raise AuthenticationFailed("验证失败!") 7 return (token_obj.user,token_obj)
在需要热认证的接口中加上
1 authentication_classes = [AuthUser]
Django自带的cache,用来缓存,默认缓存到内存中
1 from django.core.catch import cache 2 cache.set("name","shy",5)#存储时间为5秒钟 3 catch.get("name") #shy
1 from rest_framework.authentication import BaseAuthentication 2 from rest_framework.exceptions import AuthenticationFailed 3 from django.core.cache import cache 4 from app01.models import Token 5 import datetime 6 import pytz 7 #认证 8 class AuthUser(BaseAuthentication): 9 def authenticate(self, request): 10 token=request.META.get("HTTP_AUTHORIZATION") 11 token_obj=Token.objects.filter(key=token).first() 12 print('token_obj',token_obj) 13 print('token_obj',type(token_obj)) 14 if not token_obj: 15 raise AuthenticationFailed("验证失败!") 16 #检验token是否正确 17 token_obj=Token.objects.filter(key=token).first() 18 if token_obj: 19 # 校验是否在有效期内 20 now=datetime.datetime.now() 21 now=now.replace(tzinfo=pytz.timezone("UTC")) 22 state=now-token_obj.created<datetime.timedelta(weeks=2) 23 if state: 24 delta = now - token_obj.created 25 delta = datetime.timedelta(weeks=2) - delta 26 #缓存时间不能太长,七天 27 cache.set(token_obj.key,token_obj.user,min(60*60*24*7,delta.total_seconds())) 28 return (token_obj.user,token_obj) 29 else: 30 raise AuthenticationFailed("认证超时")
1 from rest_framework.views import APIView 2 3 from rest_framework.response import Response 4 from app01.models import UserInfo,Token 5 from django.contrib.auth import authenticate 6 from django.http import HttpResponse 7 from app01.utils.response import BaseResponse 8 import uuid 9 import datetime 10 #登录接口 11 class LoginView(APIView): 12 def post(self,request): 13 resture=BaseResponse() 14 user=request.data.get("username") 15 pwd=request.data.get("password") 16 print(user,pwd) 17 user_obj=authenticate(username=user,password=pwd) 18 res={"user": None, "msg": None} 19 if user_obj: 20 random_str=uuid.uuid4() 21 Token.objects.update_or_create(user=user_obj,defaults={"key":random_str,"created":datetime.datetime.now()}) 22 res["user"]=user_obj.username 23 res["token"]=random_str 24 resture.data=res 25 resture.code=1000 26 else: 27 res["msg"]="用户名或密码错误" 28 resture.msg="用户名或密码错误" 29 resture.code = 1003 30 print(res) 31 return Response(resture.dict()) 32 33 def get(self,request): 34 return HttpResponse("ok")
1 from rest_framework.views import APIView 2 from app01.utils.geetest import GeeTestLib 3 from django.conf import settings 4 import json 5 from rest_framework.response import Response 6 7 8 class CaptchaView(APIView): 9 def get(self, request): 10 gt = GeeTestLib(settings.GEE_TEST["gee_test_access_id"], settings.GEE_TEST["gee_test_access_key"]) 11 gt.pre_process() 12 # 设置 geetest session, 用于是否启用滑动验证码向 geetest 发起远程验证, 如果取不到的话只是对本地轨迹进行校验 13 # self.request.session[gt.GT_STATUS_SESSION_KEY] = status 14 # request.session["user_id"] = user_id 15 response_str = gt.get_response_str() 16 response_str = json.loads(response_str) 17 18 return Response({"error_no": 0, "data": response_str})
1 from app01.models import * 2 from app01.utils.response import BaseResponse 3 from app01.utils.exception import PricePoliceError 4 5 from django.core.exceptions import ObjectDoesNotExist 6 from django.conf import settings 7 8 from rest_framework.views import APIView 9 from rest_framework.response import Response 10 import json 11 import redis 12 pool = redis.ConnectionPool(port=6379,decode_responses=True) 13 cache=redis.Redis(connection_pool=pool) 14 15 class ShoppingcartView(APIView): 16 #还没加认证 17 def post(self,request): 18 #前端数据 19 #课程id 20 course_id=request.POST.get("course_id") 21 #价格策略id 22 price_policy_id=request.POST.get("price_policy_id") 23 # print(course_id,price_policy_id) 24 25 #用户id先写死1 26 # user_id=request.user.id 27 user_id=request.user.id 28 #校验数据 29 res = BaseResponse() 30 try: 31 #校验课程是否存在 32 course_obj=Course.objects.get(pk=course_id) 33 #校验价格策略是否合法 34 35 price_policy_dict = {} 36 for price_policy in course_obj.price_policy.all(): 37 price_policy_dict[price_policy.pk] = { 38 "pk": price_policy.pk, 39 "valid_period": price_policy.valid_period, 40 "valid_period_text": price_policy.get_valid_period_display(), 41 "price": price_policy.price, 42 "default": price_policy_id == price_policy.pk 43 } 44 45 print("price_policy_dict", price_policy_dict) 46 47 if int(price_policy_id) not in [obj.pk for obj in course_obj.price_policy.all()]: 48 raise PricePoliceError 49 except ObjectDoesNotExist as e: 50 res.code=1001 51 res.msg="课程不存在" 52 except PricePoliceError as e: 53 res.code = 1002 54 res.msg = "价格策略错误" 55 56 #将购物车信息写入redis 57 ''' 58 redis数据结构 59 redis={ 60 shoppingcar_userid_course_id:{ 61 title:'', 62 img:'', 63 }, 64 shoppingcar_1_1:{ 65 title:'', 66 img:'', 67 }, 68 shoppingcar_1_2:{ 69 title:'', 70 img:'', 71 } 72 } 73 ''' 74 pp = PricePolicy.objects.get(pk=price_policy_id) 75 #将这个人的购物车信息存到redis中 76 shoppingcar_key=settings.SHOPPINGCAR_KEY%(user_id,course_id) 77 shoppingcar_val={ 78 "id":course_obj.pk, 79 "name":course_obj.name, 80 "course_img":course_obj.course_img, 81 "relate_price_policy": price_policy_dict, 82 "choose_price_policy_id": price_policy_id, 83 "default_price": pp.price, 84 "valid_period": pp.valid_period, 85 "valid_period_text": pp.get_valid_period_display(), 86 } 87 cache.set(shoppingcar_key, json.dumps(shoppingcar_val)) 88 # cache.set(shoppingcar_key, [0,1]) 89 res.data = "加入购物车成功!" 90 print("执行完了") 91 res.data=shoppingcar_val 92 return Response(res.dict()) 93 94 def get(self,request): 95 res = BaseResponse() 96 # cache.delete("shoppingcar_1_3") 97 # cache.delete("shoppingcar_1_1") 98 99 shopping_car_keys_list=cache.keys(pattern='shoppingcar_%s_*' % (request.user.id,)) 100 print(shopping_car_keys_list) 101 shopping_car_list=[] 102 num=0 103 for key in shopping_car_keys_list: 104 dict=json.loads(cache.get(key)) 105 shopping_car_list.append(dict) 106 num=num+1 107 total=num 108 109 res.data= { 110 "total": total, 111 "shopping_car_list":shopping_car_list , 112 } 113 res.code= 1000, 114 res.msg="" 115 return Response(res.dict()) 116 117 ''' 118 理想数据类型 119 "shopping_car_list": [ 120 121 { 122 "id": 4, 123 "default_price_period": 30, 124 "relate_price_policy": { 125 "4": { 126 "valid_period": 30, 127 "valid_period_text": "1个月", 128 "default": True, 129 "prcie": 1000 130 }, 131 "5": { 132 "valid_period": 60, 133 "valid_period_text": "2个月", 134 "default": False, 135 "prcie": 1500 136 } 137 }, 138 "name": "Linux系统基础5周入门精讲", 139 "course_img": "https://luffycity.com/static/frontend/course/12/Linux5周入门_1509589530.6144893.png", 140 "default_price": 1000 141 } 142 ] 143 }, 144 '''
1 from app01.models import * 2 from app01.utils.response import BaseResponse 3 from app01.utils.exception import PricePoliceError 4 from app01.utils.exception import CommonException 5 6 from django.core.exceptions import ObjectDoesNotExist 7 from django.conf import settings 8 9 from rest_framework.views import APIView 10 from rest_framework.response import Response 11 12 import redis 13 import json 14 import datetime 15 cache=redis.Redis(decode_responses=True) 16 17 class AccountView(APIView): 18 # authentication_classes = [LoginAuth] 19 def get_coupon_list(self, request, course_id=None): 20 # print('11111111111112222222',course_id) 21 now = datetime.datetime.utcnow() 22 # course_id=str(course_id) 23 coupon_record_list = CouponRecord.objects.filter( 24 #####################3改 25 account=1, 26 status=0, 27 coupon__valid_begin_date__lte=now, 28 coupon__valid_end_date__gt=now, 29 coupon__content_type_id=9, 30 coupon__object_id=course_id 31 32 ) 33 34 coupon_list = [] 35 36 for coupon_record in coupon_record_list: 37 coupon_list.append({ 38 39 "pk": coupon_record.pk, 40 "name": coupon_record.coupon.name, 41 "coupon_type": coupon_record.coupon.get_coupon_type_display(), 42 "money_equivalent_value": coupon_record.coupon.money_equivalent_value, 43 "off_percent": coupon_record.coupon.off_percent, 44 "minimum_consume": coupon_record.coupon.minimum_consume, 45 }) 46 # print('coupon_list-----',coupon_list) 47 return coupon_list 48 49 def get(self,request): 50 res = BaseResponse() 51 try: 52 53 account_key = settings.ACCOUNT_KEY % (request.user.id, "*") 54 55 all_keys = cache.scan_iter(account_key) 56 print('all_keys',all_keys) 57 # 3.2 循环所有的keys 得到每个可以 58 account_course_list = [] 59 for key in all_keys: 60 account_course = json.loads(cache.get(key)) 61 account_course_list.append(account_course) 62 # print('account_course_list',account_course_list) 63 global_coupons_detail=cache.get("global_coupons_%s" % request.user.id) 64 # print("global_coupons_detail-----------",global_coupons_detail) 65 global_coupons = json.loads(str(global_coupons_detail)) 66 global_coupons_list=[] 67 # print('global_coupons',global_coupons) 68 for val in global_coupons: 69 global_coupons_list.append(val) 70 # print('global6565',global_coupons_list) 71 # total_price = cache.get("total_price") 72 # print(11111111) 73 total_price =0 74 #对account_course_list的处理 75 new_account_course_list=[] 76 print(account_course_list) 77 for item in account_course_list: 78 new_account_course_dict=item["course_info"] 79 coupons=item["coupons"] 80 new_account_course_dict["coupon_list"]=coupons 81 new_account_course_list.append(new_account_course_dict) 82 83 # print('-----------',item["default_price"]) 84 total_price +=int(item["course_info"]["default_price"]) 85 print(total_price) 86 87 res.data = { 88 "account_course_list": new_account_course_list, 89 "total": len(account_course_list), 90 "global_coupons": global_coupons_list, 91 "total_price": total_price 92 } 93 # print("res.data",res.data) 94 except Exception as e: 95 print('----------------',e) 96 res.code = 1033 97 res.error = "获取购物车失败" 98 99 return Response(res.dict()) 100 101 def post(self,request): 102 #获取数据 103 course_id_list=request.data.get("course_id_list") 104 print(course_id_list) 105 #校验数据 106 #有可能直接购买,也有可能在购物车中购买 107 res = BaseResponse() 108 #构建结算字典 109 account_val = {} 110 course_info={} 111 res.data = {} 112 try: 113 for course_id in course_id_list: 114 account_key=settings.ACCOUNT_KEY%(request.user.id,course_id) 115 #校验课程是否存在 116 course_obj=Course.objects.get(pk=course_id) 117 # 用户id先写死为1 118 #1.课程信息 119 shopping_car_key = settings.SHOPPINGCAR_KEY % (request.user.id, course_id) 120 course_info=json.loads(cache.get(shopping_car_key)) 121 account_val["course_info"] = course_info 122 123 #2.优惠券信息 124 coupons = self.get_coupon_list(request, course_id) 125 account_val["coupons"]=coupons 126 127 #添加到redis中 128 cache.set(account_key,json.dumps(account_val)) 129 130 res.data[account_key] = account_val 131 #通用优惠券 132 global_coupons = self.get_coupon_list(request) 133 print('111global_coupons',global_coupons) 134 global_coupons_val=cache.set("global_coupons_%s" % request.user.id, json.dumps(global_coupons)) 135 res.data["global_coupons_%s" % request.user.id]=global_coupons_val 136 137 138 except ObjectDoesNotExist as e: 139 res.code=1001 140 res.msg="课程不存在" 141 except PricePoliceError as e: 142 res.code = 1002 143 res.msg = "价格策略错误" 144 return Response(res.dict()) 145 146 def cal_coupon_price(self,price,coupon_info): 147 148 print("coupon_info",coupon_info) 149 coupon_type=coupon_info["coupon_type"] 150 money_equivalent_value=coupon_info.get("money_equivalent_value") 151 off_percent=coupon_info.get("off_percent") 152 minimum_consume=coupon_info.get("minimum_consume") 153 rebate_price=0 154 if coupon_type == "立减券": # 立减券 155 rebate_price=price-money_equivalent_value 156 if rebate_price <= 0: 157 rebate_price=0 158 elif coupon_type == "满减券": # 满减券 159 if minimum_consume > price: 160 raise CommonException(3000,"优惠券未达到最低消费") 161 else: 162 rebate_price=price-money_equivalent_value 163 elif coupon_type == "折扣券": 164 rebate_price=price*off_percent/100 165 166 return rebate_price 167 168 def put(self,request, *args, **kwargs): 169 ''' 170 choose_coupons: 171 { 172 choose_coupons={"1":2,"2":3,"global_coupon_id":5} 173 is_beli:true 174 } 175 ''' 176 res=BaseResponse() 177 # try: 178 179 # 1 获取数据 180 choose_coupons=request.data.get("choose_coupons") 181 # print("choose_coupons",choose_coupons) 182 is_beli=request.data.get("is_beli") 183 #############################1 184 user_pk=request.user.id 185 186 # 2 获取结算课程列表 187 cal_price={} 188 data=self.get(request).data.get("data") 189 # print("data",data) 190 account_course_list=data.get("account_course_list") 191 # print("account_course_list",account_course_list) 192 ''' 193 account_course_list=[{ 194 'id': 4, 195 'coupon_list': [{ 196 'off_percent': None, 197 'pk': 4, 198 'money_equivalent_value': 300.0, 199 'coupon_type': '立减券', 200 'minimum_consume': 0, 201 'name': '51劳动节' 202 }], 203 'course_img': 'https://luffycity.com/static/frontend/course/12/Linux5周入门_1509589530.6144893.png', 204 'default_price': 1500.0, 205 'default_price_period': 60, 206 'relate_price_policy': { 207 '5': { 208 'valid_period_text': '2个月', 209 'default': True, 210 'valid_period': 60, 211 'prcie': 1500.0 212 }, 213 '4': { 214 'valid_period_text': '1个月', 215 'default': False, 216 'valid_period': 30, 217 'prcie': 1000.0 218 } 219 }, 220 'default_price_policy_id': 5, 221 'name': 'Linux系统基础5周入门精讲' 222 }, { 223 'id': 2, 224 'coupon_list': [{ 225 'off_percent': 80, 226 'pk': 3, 227 'money_equivalent_value': 0.0, 228 'coupon_type': '折扣券', 229 'minimum_consume': 0, 230 'name': '清明节活动' 231 }], 232 'course_img': 'https://luffycity.com/static/frontend/course/3/Django框架学习_1509095212.759272.png', 233 'default_price': 300.0, 234 'default_price_period': 30, 235 'relate_price_policy': { 236 '3': { 237 'valid_period_text': '1个月', 238 'default': True, 239 'valid_period': 30, 240 'prcie': 300.0 241 }, 242 '1': { 243 'valid_period_text': '1周', 244 'default': False, 245 'valid_period': 7, 246 'prcie': 100.0 247 }, 248 '2': { 249 'valid_period_text': '2周', 250 'default': False, 251 'valid_period': 14, 252 'prcie': 200.0 253 } 254 }, 255 'default_price_policy_id': 3, 256 'name': 'Django框架学习' 257 }] 258 ''' 259 account_courses_info={} 260 # print("account_course_list",account_course_list) 261 for account_course in account_course_list: 262 temp={ 263 "coupon":{}, 264 "default_price":account_course["default_price"] 265 } 266 account_courses_info[account_course["id"]]=temp 267 268 for item in account_course["coupon_list"]: 269 270 # print("choose_coupons",choose_coupons) # {'4': 4} 271 # print(str(account_course["id"])) 272 273 coupon_id=choose_coupons.get(str(account_course["id"])) 274 # print("-----------------") 275 # print(type(coupon_id)) 276 # print(type(item["pk"])) 277 # print(item) 278 # print(coupon_id == item["pk"]) 279 if coupon_id == str(item["pk"]): 280 temp["coupon"]=item 281 print('temp',temp) 282 print("account_course_info",account_courses_info) 283 price_list=[] 284 total_price=0 285 ''' 286 { 287 2: { 288 'coupon': { 289 'money_equivalent_value': 0.0, 290 'name': '清明节活动', 291 'pk': 3, 292 'off_percent': 80, 293 'coupon_type': '折扣券', 294 'minimum_consume': 0 295 }, 296 'default_price': 200.0 297 } 298 } 299 ''' 300 for key,val in account_courses_info.items(): 301 if not val.get("coupon"): 302 price_list.append(val["default_price"]) 303 cal_price[key]=val["default_price"] 304 else: 305 coupon_info=val.get("coupon") 306 default_price=val["default_price"] 307 rebate_price=self.cal_coupon_price(default_price,coupon_info) 308 price_list.append(rebate_price) 309 cal_price[key]=rebate_price 310 311 print("课程优惠券后价格列表price_list",price_list) 312 total_price=sum(price_list) 313 # 3 计算通用优惠券的价格 314 global_coupon_id=choose_coupons.get("global_coupon_id") 315 if global_coupon_id: 316 317 global_coupons=data.get("global_coupons") 318 print("global_coupons",global_coupons) 319 global_coupon_dict={} 320 for item in global_coupons: 321 global_coupon_dict[item["pk"]]=item 322 total_price=self.cal_coupon_price(total_price,global_coupon_dict[global_coupon_id]) 323 print("通用优惠券",global_coupon_dict[global_coupon_id]["coupon_type"]) 324 print("计算后total_price=",total_price) 325 326 # 计算贝里 327 print("beili",is_beli,type(is_beli)) 328 print("北里",is_beli) 329 # if is_beli: 330 # print("request.user.beli",request.user.beli) 331 # total_price=total_price-request.user.beli/10 332 # if total_price<0: 333 # total_price=0 334 # print("贝里数计算后",total_price) 335 print('total_price',total_price) 336 cal_price["total_price"]=total_price 337 res.data=cal_price 338 print("res.data",res.data) 339 # except Exception as e: 340 # res.code=500 341 # res.msg="结算错误!"+str(e) 342 343 return Response(res.dict())
特点:彼此互解
作用:
1.加密数据(公钥加密)
2.数字签名(私钥加密)