luffy项目
2019-03-10 15:26:48 0 举报仅支持查看
AI智能生成
项目
luffy
模版推荐
作者其他创作
大纲/内容
课程模块
根据功能设计表结构
接口的编写
Django的MEDIA配置
#settings.py<br>STATIC_URL = "/static/"<br>#Media配置<br>MEDIA_URL = ”media/“<br>MEDIA_ROOT = os.path.join(BASE_DIR,"media")
#urls.py<br>from django.conf.urls import url, include<br>from django.contrib import admin<br>from django.views.static import serve<br>from new_luffy import settings<br>urlpatterns = [<br> url(r'^admin/', admin.site.urls),<br> url(r'^api/course/', include("course.urls")),<br> # media路径配置<br> url(r'media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT})<br>]<br>
redis
Redis特点
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis支持五种数据类型。
Redis支持数据库备份。
Redis的优势
Redis性能极高,读的速度是110000次/s,写的速度是81000次/s
Redis丰富的数据类型,String,Lists,Hashes,Sets以及Ordered Sets
Redis的所有操作都是原子性的,意思就是要么成功执行,要么完全失败不执行,多个操作支持事物。即MULTI和EXEC指令包起来。
Redis有丰富的特性,支持publish/subscribe,通知,key过期等等特性。
Redis配置
可以通过redis-cli 进入交互模式,使用config命令查看或设置配置项。也可以进入配置文件用vim编辑器进行修改。
redis数据类型
-- String 字符串 <br><br> -- redis的string可以包含任何数据,包括图片以及序列化的对象,一个键最大能存储512MB。
-- Hash 哈希<br><br> -- redis的hash是一个String类型的key和value的映射表,hash特别适合存储对象,类比python字典。
-- List 列表<br><br> -- redis的list是简单的字符串列表,按照插入顺序排序,可以从两端进行添加,类似于双向链表,列表还可以进行阻塞。
-- Set 集合<br><br> -- redis的set是字符串类型的无序且不重复集合。集合是通过哈希表实现的,所以添加,删除,查找的时间复杂度都是O(1)。
-- Zset 有序集合<br><br> -- redis的zset和set一样,不同的是每个元素都会关联一个double类型的分数,redis正是通过对分数的排序对集合进行有序存储。
下载
pip install redis
连接
Redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,<br><br> Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。<br><br> Redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。<br><br> 如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接<br><br> 连接redis,加上decode_responses=True,写入的键值对中的value为str类型,不加这个参数写入的则为字节类型。
Python Redis连接池
使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。<br><br> 默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,<br><br> 然后作为参数传给Redis实例,这样就可以实现多个Redis实例共享一个连接池
redis的发布订阅者模式
redis订阅者
# by gaoxin<br>import redis<br><br>r = redis.Redis(host="127.0.0.1", password="", decode_responses=True)<br><br># 第一步 生成一个订阅者对象<br>pubsub = r.pubsub()<br># 第二步 订阅一个消息 实际上就是监听这个键<br>pubsub.subscribe("gaoxin")<br><br># 第三步 死循环一直等待监听结果<br>while True:<br> print("working~~~")<br> msg = pubsub.parse_response()<br> print(msg)
redis发布者
# by gaoxin<br>import redis<br><br>r = redis.Redis(host="127.0.0.1", password="", decode_responses=True)<br><br>r.publish("gaoxin", "hahaha")
购物模块之结算中心
# by gaoxin<br>from rest_framework.views import APIView<br>from rest_framework.response import Response<br>from utils.base_response import BaseResponse<br>from utils.redis_pool import pool<br>from django.utils.timezone import now<br>import redis<br>from utils.authentication import MyAuth<br>from .shop import SHOPPING_CAR_KEY<br>from pay.models import CouponRecord<br>from django.contrib.contenttypes.models import ContentType<br>import json<br>"""<br>结算中心<br>在购物车里选择了商品以及价格策略点击结算 才进入结算中心<br>在结算中心用户可以选择优惠券<br>传过来的数据 [course_id, course_id]<br>根据用户id 以及商品id 构建一个存入redis的key<br>SETTLEMENT_KEY = "settlement_%s_%s"<br>接下来构建结算中心数据结构<br>redis = {<br> settlement_用户id_课程id: {<br> "id": course.id, 带用户id是为了用户查看购物车的时候需要<br> "title": course.name,<br> "img": str(course.course_img),<br> "period_display": item.get_valid_period_display(), 价格策略中文<br> "price": item.price, 价格<br> "course_coupons": {<br> course_coupon_id: {...}<br> } <br> 用户选中的优惠券id 在更新请求 也就是用户选了优惠券的时候更改<br> 前端默认优惠券可以是不选的 根据业务决定<br> default_coupon_id: 1<br> }<br> global_coupon_用户id: {<br> global_coupon_id: {....},<br> # 在用户进入结算中心选择优惠券的时候 也就是更新请求的时候更改 <br> default_global_coupon_id: 1 <br> }<br>}<br><br>"""<br><br>SETTLEMENT_KEY = "settlement_%s_%s"<br>GLOBAL_COUPON_KEY = "global_coupon_%s"<br>REDIS_CONN = redis.Redis(connection_pool=pool)<br><br><br>class SettlementView(APIView):<br> """<br> code为1020开始的都是结算中心的错误<br> 1021 获取课程id失败<br> """<br> authentication_classes = [MyAuth, ]<br><br> # 进入结算中心 也就是用户查看自己的未支付订单<br> def get(self, request, *args, **kwargs):<br> res = BaseResponse()<br> try:<br> # 1 从redis结算中心获取数据并展示<br> # 根据用户id 得到 settlement_id_userid_*<br> user_id = request.user.pk<br> settlement_key = SETTLEMENT_KEY % (user_id, "*")<br> # scan_iter 得到所有的key<br> all_settlement_keys = REDIS_CONN.scan_iter(settlement_key)<br> global_coupon_key = GLOBAL_COUPON_KEY % user_id<br> # 2 循环遍历得到所有信息<br> settlement_list = []<br> for key in all_settlement_keys:<br> settlement_info = REDIS_CONN.hgetall(key)<br> settlement_list.append(settlement_info)<br> global_coupon_info = REDIS_CONN.hgetall(global_coupon_key)<br> res.data = {"settlement_list": settlement_list, "global_coupon_info": global_coupon_info}<br> except Exception as e:<br> res.code = 1024<br> res.error = "获取结算中心失败"<br> return Response(res.dict)<br><br> # 把商品添加到结算中心 用户传过来的数据是 【course_id,course_id】<br> def post(self, request, *args, **kwargs):<br> res = BaseResponse()<br> # 1 获取前端传过来的数据以及用户id<br> try:<br> course_list = request.data.get("course_list", "")<br> if not course_list:<br> res.code = 1021<br> res.error = "获取课程id失败"<br> return Response(res.dict)<br> user_id = request.user.pk<br> # 2 检查数据的合法性 查看课程id 是否在购物车中<br> for course_id in course_list:<br> # course_id = int(course_id)<br> shopping_car_key = SHOPPING_CAR_KEY % (user_id, course_id)<br> if not REDIS_CONN.exists(shopping_car_key):<br> res.code = 1022<br> res.error = "结算的课程id不合法"<br> return Response(res.dict)<br> # 3 从购物车中获取课程的信息 并构建成结算中心的数据格式放入redis<br> # 3.1 先从redis中拿购物车中的数据<br> course_info = REDIS_CONN.hgetall(shopping_car_key)<br> # 3.2 获取用户所有符合条件优惠券<br> # 注意优惠券的使用期限以及状态<br> now_time = now()<br> # course_table_id = ContentType.objects.filter(app_label="course", model="course").first().pk<br> user_all_coupons = CouponRecord.objects.filter(<br> account_id=user_id,<br> status=0,<br> coupon__valid_begin_date__lte=now_time,<br> coupon__valid_end_date__gte=now_time,<br> # content_type_id=course_table_id,<br> # object_id=course_id<br> ).all()<br> # 3.2 构建数据结构<br> course_coupons = {}<br> global_coupons = {}<br> for coupon_record in user_all_coupons:<br> # 证明这个优惠券是绑定课程的优惠券<br> coupon = coupon_record.coupon<br> if coupon.object_id == course_id:<br> course_coupons[coupon.id] = {<br> "name": coupon.name,<br> "coupon_type": coupon.get_coupon_type_display(),<br> "money_equivalent_value": coupon.money_equivalent_value,<br> "off_percent": coupon.off_percent,<br> "minimum_consume": coupon.minimum_consume,<br> "object_id": coupon.object_id,<br> }<br> elseif coupon.object_id == "":<br> global_coupons[coupon.id] = {<br> "name": coupon.name,<br> "coupon_type": coupon.get_coupon_type_display(),<br> "money_equivalent_value": coupon.money_equivalent_value,<br> "off_percent": coupon.off_percent,<br> "minimum_consume": coupon.minimum_consume,<br> "object_id": coupon.object_id,<br> }<br> # print(json.loads(course_info["price_policy_dict"]))<br> price_policy_dict = json.loads(course_info["price_policy_dict"])<br> default_policy_id = course_info["default_policy"]<br> price = price_policy_dict[default_policy_id]["price"]<br> print(price)<br> period_display = price_policy_dict[default_policy_id]["valid_period_text"]<br> print(period_display)<br> settlement_info = {<br> "id": course_info["id"],<br> "title": course_info["title"],<br> "img_src": course_info["img_src"],<br> "price": price,<br> "period_display": period_display,<br> "course_coupons": json.dumps(course_coupons, ensure_ascii=False),<br> }<br> # 3.3 准备构建结算中心的key<br> settlement_key = SETTLEMENT_KEY % (user_id, course_id)<br> global_coupon_key = GLOBAL_COUPON_KEY % user_id<br> # # 3.4 写入redis<br> REDIS_CONN.hmset(settlement_key, settlement_info)<br> print(global_coupons)<br> if global_coupons:<br> REDIS_CONN.hmset(global_coupon_key, global_coupons)<br> # # 4 加入结算中心成功 清除用户购物车中的相应课程的数据<br> REDIS_CONN.delete(shopping_car_key)<br> res.data = "加入结算中心成功"<br> except Exception as e:<br> print(e)<br> res.code = 1020<br> res.error = "结算失败"<br> return Response(res.dict)<br><br> # 用户在结算中心的时候更改优惠券<br> # 用户在选择优惠券的时候前端传过来course_id 以及coupon_id<br> # 如果选的是全局优惠券 就传 global_coupon_id<br> def patch(self, request, *args, **kwargs):<br> res = BaseResponse()<br> try:<br> # 1 获取前端传过来的数据<br> course_id = request.data.get("course_id", "")<br> coupon_id = request.data.get("coupon_id", "")<br> global_coupon_id = request.data.get("global_coupon_id", "")<br> user_id = request.user.pk<br> # 2 校验数据的合法性<br> # 2.2 校验course_id是否合法<br> settlement_key = SETTLEMENT_KEY % (user_id, course_id)<br> if not REDIS_CONN.exists(settlement_key):<br> res.code = 1027<br> res.error = "课程id不合法"<br> return Response(res.dict)<br> # 2.3 校验coupon_id 是否合法<br> course_info = REDIS_CONN.hgetall(settlement_key)<br> course_coupon_dict = json.loads(course_info["course_coupons"])<br> if coupon_id not in course_coupon_dict:<br> res.code = 1028<br> res.error = "课程的优惠券不合法"<br> return Response(res.dict)<br> # 2.4 校验global_coupon_id是否合法 如果合法把默认的全局优惠信息放入redis<br> if global_coupon_id:<br> global_coupon_key = GLOBAL_COUPON_KEY % user_id<br> if not REDIS_CONN.exists(global_coupon_key):<br> res.code = 1029<br> res.error = "全局优惠券不合法"<br> return Response(res.dict)<br> REDIS_CONN.hset(global_coupon_key, "default_coupon_id", global_coupon_id)<br> # 3 给数据里加入默认选择的课程优惠券<br> REDIS_CONN.hset(settlement_key, "default_course_coupon_id", coupon_id)<br> res.data = "修改优惠券成功"<br> except Exception as e:<br> res.code = 1026<br> res.error = "更改优惠券失败"<br> return Response(res.dict)
三方服务之微信消息推送
微信模板消息<br> 1, 关注我的公众号<br> -- 让用户扫码关注 <br> -- 这个时候用户只能看我发表的文章<br> 2, 引导用户做授权<br> -- 目的 让用户告诉微信他允许微信把他的微信id<br> 发给这个公众号<br> -- 让用户给微信指定的url发请求 <br> URL?app_id="公众号的ID"&state=uid&redirect_uri="回调地址"<br> -- 把上面的url生成二维码给用户<br> -- 微信要做二次验证 相当于跟我们握手<br> 给我们配置的redirect_uri="回调地址"发请求<br> 微信携带 code= "xxx" state=uid<br> 再回调地址对应的视图函数里<br> 再给微信发请求{<br> appID<br> secret_key<br> code <br> }<br> 获取wx_id<br> 保存到数据库 <br> 3, 发送消息 <br> -- 1, 获取认证access_token<br> 理解为我们登陆后的认证标识<br> 相当于我们去微信那里登陆后微信给我返回一个token<br> token的有效期2小时<br> -- 2,发送消息<br> 发送消息的接口urlxxxxxxxxx?access_token=""<br> 发送什么样的消息就去调用什么样的接口
三方服务之保利威视频播放
保利威视频的播放<br> 加密播放 -- 防下载<br> -- H5播放器 <br> vid: "",<br> playsafe: "token"<br> playsafe: function(vid, next){<br> do something.....<br> next("token")<br> }<br> -- 获取token<br> 向保利威提供的接口发POST请求<br> URL: "https://hls.videocc.net/service/v1/token"<br> Content-Type : urlencoded<br> data: {按照文档的要求携带数据}<br> response = {status: 200, message: "error", "token": "随机字符串" }<br> -- POST请求携带的数据<br> -- 1 # POST请求携带的数据<br> data = {<br> "userId": self.USER_ID,<br> "videoId": vid,<br> "ts": time_stamp,<br> "viewerIp": remote_addr,(看视频的IP地址)<br> "viewerId": uid,<br> "viewerName": username,<br> "extraParams": extra_params,<br> "sign": "xxxxxx"<br> }<br> -- 获得 sign<br> "userId": self.USER_ID,<br> "videoId": vid,<br> "ts": time_stamp,<br> "viewerIp": remote_addr,(看视频的IP地址)<br> "viewerId": uid,<br> "viewerName": username,<br> "extraParams": extra_params,<br> -- 1 把上面的数据按照ASCII升序排列<br> -- 2 前后加secret_key<br> -- 3 取MD5加密的大写<br> 跑马灯播放 -- 防盗录<br> 前端<br> 要求你用新js<br> code : MyRandomCode<br> 后端<br> 1 当我们用新的js播放器播放开启跑马灯的视频的时候<br> 2 保利威会向我们配置的回调的url发送GET请求<br> 3 在URL携带?vid=xx&code=xxx&t=xxx&callback=xxx<br> 4 要求你这个接口返回Json数据 <br> {<br> "status": status,<br> "username": username,<br> "sign": sign,<br> "msg": msg,<br> "fontSize": "18",<br> "fontColor": "0xFF0000",<br> "speed": "50",<br> "filter": "on",<br> "setting": "2",<br> "alpha": "0.7",<br> "filterAlpha": "1",<br> "filterColor": "0x3914AF",<br> "blurX": "2",<br> "blurY": "2",<br> "tweenTime": "1",<br> "interval": "3",<br> "lifeTime": "3",<br> "strength": "4",<br> "show": "on"<br> }<br> 5 sign的获取<br> self.generate_md5_num("vid={}&secretkey={}&username={}&code={}&status={}&t={}".format(<br> vid, self.SECRET_KEY, username, code, status, t<br> )).lower()
登录认证模块
认证
任何的项目都需要认证,用户输入了用户名和密码,验证通过,代表用户登录成功~~~<br>HTTP请求是无状态的,下次这个用户再请求,我们是不可能识别这个用户是否登录的~~
TOKEN
用户登录成功后,生成一个随机字符串token给前端返回~~~<br><br>那么前端以后都携带这个token来访问~~这样我们只需要鉴别这个token~来做认证~~
购物模块之购物车
from rest_framework.views import APIView<br>from rest_framework.response import Response<br>from utils.authentication import MyAuth<br>from utils.redis_pool import pool<br>from utils.base_response import BaseResponse<br>from course.models import Course<br>import redis<br>import json<br><br><br><br><br>"""<br>购物车<br>redis 的数据结构设计<br>redis = {<br> shopping_car_<user_id>_<course_id>: {<br> "id": course.id, 带用户id是为了用户查看购物车的时候需要<br> "title": course.name,<br> "img": str(course.course_img),<br> "policy_dict": {<br> policy_id:{<br> "period": item.valid_period, 价格策略<br> "period_display": item.get_valid_period_display(), 价格策略中文<br> "price": item.price, 价格<br> },<br> policy_id2:{<br> ....<br> }<br> },<br> "default_policy": policy_id ,选择的价格策略id<br> }<br> <br> <br>}<br>"""<br>REDIS_CONN = redis.Redis(connection_pool=pool)<br>SHOPPING_CAR_KEY = "shopping_car_%s_%s"<br><br><br>class ShoppingCarView(APIView):<br> """<br> 购物车接口<br> 1010 代表成功<br> 1011 课程不存在<br> 1012 价格策略不存在<br> 1013 获取购物车失败<br> 1014 删除的购物车数据不存在<br> """<br> authentication_classes = [MyAuth, ]<br><br> # 展示购物车数据<br> def get(self, request, *args, **kwargs):<br> res = BaseResponse()<br> # 1 从redis获取购物车数据<br> try:<br> user_id = request.user.pk<br> shopping_car_key = SHOPPING_CAR_KEY % (user_id, "*")<br> # 用scan_iter方法获取用户购物车的所有key<br> all_keys = REDIS_CONN.scan_iter(shopping_car_key)<br> ret = []<br> # 循环得到所有想要的数据<br> for key in all_keys:print(REDIS_CONN.hgetall(key))<br> ret.append(REDIS_CONN.hgetall(key))<br> res.data = ret<br> except Exception as e:<br> res.code = 1013<br> res.error = "获取购物车失败"<br> return Response(res.dict)<br><br> # 给购物车增加商品<br> # 传过来的数据 有 课程ID 以及价格策略ID<br> def post(self, request, *args, **kwargs):<br> res = BaseResponse()<br> try:<br> # 1 获取用户提交的课程ID以及价格策略ID<br> course_id = request.data.get("course_id", "")<br> price_policy_id = request.data.get("price_policy_id", "")<br> user_id = request.user.pk<br> # 2 检查用户传过来的数据是否合法<br> # 2.1 查看课程ID是否存在<br> course_obj = Course.objects.filter(pk=course_id).first()<br> if not course_obj:<br> res.code = 1011<br> res.error = "课程对象不存在"<br> # 2.2 查看价格策略是否合法<br> # 获取该课程的所有价格策略<br> price_policy_queryset = course_obj.price_policy.all()<br> price_policy_dict = {}<br> for price_policy in price_policy_queryset:<br> price_policy_dict[price_policy.pk] = {<br> "price": price_policy.price,<br> "valid_period": price_policy.valid_period,<br> "valid_period_text": price_policy.get_valid_period_display(),<br> }<br> if price_policy_id not in price_policy_dict:<br> res.code = 1012<br> res.error = "课程的价格策略不存在"<br><br> # 3 用户数据合法 得到用户的购物车key<br> shopping_car_key = SHOPPING_CAR_KEY % (user_id, course_id)<br> # 4 构建购物车数据<br> course_info = {<br> "id": course_id,<br> "title": course_obj.title,<br> "img_src": str(course_obj.course_img),<br> "default_policy": price_policy_id,<br> "price_policy_dict": json.dumps(price_policy_dict)<br> }<br> # 5 写入redis hmset这个方法有值就更新 没值就新建 解决了用户重复点一个商品的问题<br> REDIS_CONN.hmset(shopping_car_key, course_info)<br><br> res.data = "加入购物车成功"<br> except Exception as e:<br> print(e)<br> res.code = 1010<br> res.error = "加入购物车失败"<br> return Response(res.dict)<br><br> # 删除购物车数据<br> # 传过来的数据 {course_ids: [1,2]}<br> def delete(self, request, *args, **kwargs):<br> res = BaseResponse()<br> # 1 验证数据合法性 课程ID是否在购物车里<br> try:<br> for course_id in request.data["course_ids"]:<br> shopping_car_key = SHOPPING_CAR_KEY % (request.user.pk, course_id)<br> if not REDIS_CONN.exists(shopping_car_key):<br> res.code = 1014<br> res.error = "课程不存在购物车"<br> # 2 数据合法 删除redis购物车里的数据<br> REDIS_CONN.delete(shopping_car_key)<br> except Exception as e:<br> res.code = 1015<br> res.error = "删除购物车失败"<br> return Response(res.dict)<br><br> # 更新购物车里的课程的价格策略<br> # 传过来的数据 有 course_id 以及 price_policy_id<br> def patch(self, request, *args, **kwargs):<br> res = BaseResponse()<br> # 1 验证数据的合法性 course_id 以及 policy_id<br> try:<br> course_id = request.data["course_id"]<br> policy_id = request.data["price_policy_id"]<br> # 判断redis购物车里是否有course_id<br> shopping_car_key = SHOPPING_CAR_KEY % (request.user.pk, course_id)<br> if not REDIS_CONN.exists(shopping_car_key):<br> res.code = 1014<br> res.error = "课程不存在购物车"<br> # 判断policy_id 是否合法<br> price_policy_dict = json.loads(REDIS_CONN.hget(shopping_car_key, "price_policy_dict"))<br> if str(policy_id) not in price_policy_dict:<br> res.code = 1015<br> res.error = "价格策略不合法"<br> # 2 更改购物车里的数据<br> REDIS_CONN.hset(shopping_car_key, "default_policy", policy_id)<br> except Exception as e:<br> print(e)<br> res.code = 1016<br> res.error = "更新购物车失败"<br> return Response(res.dict)
购物模块之支付中心
支付接口<br> 前端会传过来 price banlance<br> 1, 获取前端传过来的数据 以及user_id<br> 2,校验数据的合法性 price banlance<br> !! redis中结算中心的数据跟支付的时候有时间差<br> !! 优惠券过期 商品下架<br> -- 校验贝里<br> -- 跟数据库用户的贝里余额去校验<br> -- 校验课程是否下架<br> -- 从redis中的结算中心拿课程id 去数据库校验是否下架<br> -- 优惠券是否过期<br> -- 校验课程的优惠券<br> -- 从redis结算中心取default_course_coupon_id<br> 去数据库校验这个优惠券对象是否过期<br> -- 校验全局优惠券<br> -- 从redis全局优惠券取default_global_coupon_id<br> 去数据库校验这个优惠券对象是否过期<br> -- 校验价格<br> -- 先得到所有课程的折后价格的总和<br> -- 课程折后总价跟全局优惠券去做计算<br> -- 抵扣贝里<br> -- 得到最终价格跟price校验<br> 3, 数据合法 建议一个订单<br> 4,掉支付宝接口去支付<br> 5,notify_url 修改订单以及订单详情 优惠券 贝里<br> <br> !!! 做计算都是浮点型或整形<br> !!! 设计数据库的时候尽量不要有null 给默认值
三方服务之支付宝支付
支付宝的支付<br> 1,生成应用的公钥和私钥 注意选择非java适用<br> 2,在沙箱环境里放你应用的公钥<br> 3,在项目里 放的你应用的私钥以及支付宝的公钥
三方服务之滑动验证码
-- 在你需要用滑动验证码的页面<br> 默认发一个ajax GET请求<br> http://127.0.0.1:8000/pc-geetest/register?t=" + (new Date()).getTime(),<br> 返回值<br> gt challenge success<br> -- 发送请求成功<br> initGeetest({config}, function)<br> config: {<br> gt: gt<br> challenge<br> success<br> product: "popup"<br> }<br> 执行回调函数function(验证码对象)<br> -- 回调函数里<br> -- 发送请求 POST请求<br> "http://127.0.0.1:8000/pc-geetest/ajax_validate"<br> data: {<br> username: that.username,<br> password: that.pwd,<br> geetest_challenge: validate.geetest_challenge,<br> geetest_validate: validate.geetest_validate,<br> geetest_seccode: validate.geetest_seccode<br> }<br> 请求成功的回调函数<br> 获取后端返回的信息 显示是否登录成功<br> <br> -- that.$refs.submit.onclick = function () {<br> captchaObj.show();<br> };<br> // 点击登录显示验证码<br> -- captchaObj.appendTo("#popup-captcha");<br> // 将验证码加到id为captcha的元素里<br>Django的Cookie和Session<br> 设置session<br> request.session["key"] = value<br> 获取session<br> request.session.get("")<br> 设置Cookie<br> response.Cookie.set()<br> 获取Cookie<br> Cookie.get()
Collect
Get Started
Collect
Get Started
Collect
Get Started
Collect
Get Started
评论
0 条评论
下一页