def login(request, response: Response, data: dict): if not bool(request.session.get('user')): if 'username' in data and 'password' in data: username = data['username'] password = data['password'] if User.objects.filter(username=username).exists(): user = User.objects.get(username=username) if user.check_password(password): request.session['user'] = { 'username': user.username, 'email': user.email, 'first_name': user.first_name, 'last_name': user.last_name, 'login_at': str(datetime.datetime.now()), } if not request.session.session_key: request.session.create() response.set_cookie('sessionid', request.session.session_key) response.data = {'login': '******', 'user': { 'username': user.username, 'email': user.email, 'first_name': user.first_name, 'last_name': user.last_name, }, } else: response.data = {'login': '******'} else: response.data = {'login': '******'} return response
def post(self, request): username = request.user.user_name token = request.auth # res = Response({"username": username}) # res.set_cookie("username", username) """ 本意: 通过写一个叫username的cookie, 在点赞或评论的时候 就能找到是哪个用户进行的操作。 问题: 这样不安全, 可以通过修改cookie来伪造身份 解决: 写到session里 """ res = Response({"username": username}) res.set_cookie("token", token) res.set_cookie("username", username) return res
def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) jwt_response_payload_handler = jwt_settings.JWT_RESPONSE_PAYLOAD_HANDLER if serializer.is_valid(): user = serializer.object.get('user') or request.user user.last_login = datetime.utcnow() if serializer.validated_data.get('device_id'): user.device_id = serializer.validated_data['device_id'] user.save() token = serializer.object.get('token') response_data = jwt_response_payload_handler(token, user, request) response = Response(response_data) if jwt_settings.JWT_AUTH_COOKIE: expiration = (datetime.utcnow() + jwt_settings.JWT_EXPIRATION_DELTA) response.set_cookie(api_settings.JWT_AUTH_COOKIE, token, expires=expiration, httponly=True) return response return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def post(self, request): """ 思路: 获取数据进行验证 获取商品id, count 和是否选中信息 选中状态 默认为True, 同时 前端 是否选中的字段 可传可不穿 判断用户是否为登录用户 如果为登录用户,则将数据保存到redis中 连接数据库redis 将商品放到redis中, 同时记录状态(把选中的记录一下) 返回响应 如果为非登录用户,则保存到cookie中 先读取cookie的数据, 判断有没有数据 如果有数据, 我们需要将数据 解析出来 跟新数据 如果没有 直接保存数据 如果有 需要把count 进行累加 把数据加密 """ # 获取数据,进行校验 serializer = CartSerializer(data=request.data) serializer.is_valid(raise_exception=True) # 获取商品id, count 和 是否选中 sku_id = serializer.data.get('sku_id') count = serializer.data.get('count') selected = serializer.data.get('selected') # 判断用户是否登陆 try: user = request.user except Exception: # 验证失败,用户为登陆 user = None # 判断是否为登录用户 if user is not None and user.is_authenticated: # 如果为登陆状态,则将数据保存至redis中 redis_count = get_redis_connection('cart') pl = redis_count.pipeline() # 勾选 if selected: pl.sadd('cart_selected_%s' % user.id, sku_id) pl.execute(serializer.data) else: # 如果为非登陆用户,保存至cookie中 cart_str = request.COOKIES.get('cart') # 先获取cookie信息, 判断是否存在购物车信息 if cart_str is None: cart_dict = pickle.loads(base64.b64decode(cart_str.encode)) else: cart_dict = {} # 获取购物车数量 # 如果有相同的商品,求和 if sku_id in cart_dict: origin_count = cart_dict[sku_id]['count'] count += origin_count cart_dict[sku_id]: { 'count': count, 'selected': selected, } # 设置 cookie数据 response = Response(serializer.data) # 将二进制转换为字符串 cookie_cart = base64.b64encode(pickle.dumps(cart_dict).decode()) response.set_cookie('cart', cookie_cart) # 返回响应 return response
def put(self, request): """ 接受前端提交上的数据 校验 获取数据 request.user 判断用户的登陆状态 登录用户的数据 保存在redis中 连接 修改数据 返回数据 未登录的数据 保存在cookie中 获取数据并判断 更新 设置cookie返回响应 """ """ 修改购物车数据 思路: # 创建序列化,校验数据 #获取数据 #获取用户 #判断用户是否为登录用户 #登录用户,从redis中获取数据 #非登录用户,从cookie中获取数据 """ # 创建序列化,校验数据 serializer = CartSerializer(data=request.data) serializer.is_valid(raise_exception=True) sku_id = serializer.data.get('sku_id') count = serializer.data.get('count') selected = serializer.data.get('selected') # 获取用户 try: user = request.user except Exception: user = None # 判断用户是否为登录用户 if user is not None and user.is_authenticated: # 登录用户,从redis中获取数据 redis_conn = get_redis_connection('cart') pl = redis_conn.pipeline() # 更新数据 pl.hset('cart_%s' % user.id, sku_id, count) # 更改状态 if selected: pl.sadd('cart_selected_%s' % user.id, sku_id) else: pl.srem('cart_selected_%s' % user.id, sku_id) pl.execute() return Response(serializer.data) else: # 非登录用户,从cookie中获取数据 cart_str = request.COOKIES.get('cart') if cart_cookie is not None: cart = pickle.loads(base64.b64decode(cart_str.encode())) else: cart = {} if sku_id in cart: cart[sku_id] = {'count': count, 'selected': selected} cookie_str = base64.b64encode(pickle.dumps(cart)).decode() response = Response(serializer.data) response.set_cookie('cart', cookie_str) return response