コード例 #1
0
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
コード例 #2
0
 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
コード例 #3
0
    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)
コード例 #4
0
    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
コード例 #5
0
    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