예제 #1
0
    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')
        # print("-----",username)
        user = authenticate(request, username=username, password=password)
        # print("----",username)

        if user is None:
            return render(request, 'login.html',
                          {'account_errmsg': '用户名或密码错误'})

        # 4.保持登录状态
        login(request, user)

        # 5.是否记住用户名
        if remembered != 'on':
            # 不记住用户名, 浏览器结束会话就过期
            request.session.set_expiry(0)
        else:
            # 记住用户名, 浏览器会话保持两周
            request.session.set_expiry(None)

        # 6.返回响应结果
        response = redirect(reverse('contents:index'))
        response.set_cookie('username', user.username, max_age=3600 * 24 * 15)

        from apps.carts.utils import merge_cart_cookie_to_redis
        merge_cart_cookie_to_redis(request=request, response=response)

        return response
예제 #2
0
    def post(self, request):
        # 接收参数
        username = request.POST.get("username")
        password = request.POST.get("password")
        remembered = request.POST.get("remembered")

        # 校验

        # 数据库查询

        try:
            # django自带的认证方法
            from django.contrib.auth import authenticate
            user = authenticate(request, username=username, password=password)
        except User.DoesNotExist as e:
            logger.error(e)
            return http.HttpResponseForbidden("查无此人")

        # 修改最后登录时间为今天
        try:
            from datetime import date
            user.last_login = date.today()
            user.save()
        except Exception as e:
            logger.error(e)

        # 判断是否记住登陆
        if remembered == "on":
            request.session.set_expiry(None)
        else:
            request.session.set_expiry(0)

        # 判断用户是否存在
        if user is None:
            return render(request, 'login.html',
                          {'account_errmsg': '用户名或密码错误'})
        else:
            # 设置session
            login(request, user)
            next = request.GET.get("next")
            if next:
                response = redirect(next)
                response.set_cookie("username",
                                    user.username,
                                    max_age=3600 * 24 * 15)
                return response
            else:
                response = redirect(reverse("users:index"))
                # 设置cookie
                response.set_cookie("username",
                                    user.username,
                                    max_age=3600 * 24 * 15)

                # 合并购物车
                from apps.carts.utils import merge_cart_cookie_to_redis
                merge_cart_cookie_to_redis(request, response)

                return response
예제 #3
0
    def post(self, request):
        '''
        :param request: 请求对象
        :return: 登陆成功页
        '''
        # 获取数据进行验证
        username = request.POST.get('username')
        password = request.POST.get('pwd')
        remembered = request.POST.get('remembered')

        # 判断必填项
        if not all([username, password]):
            return JsonResponse({'code': -2, 'errormsg': '必填项为空'})
        # 判断用户信息和数据库中是否一致----认证用户
        from django.contrib.auth import authenticate
        # 验证用户名密码是否正确
        user = authenticate(username=username, password=password)

        if user is None:
            return render(request, 'login.html', {'errormsg': '用户名或密码错误'})
        # 状态保存--会话有效期为关闭浏览器
        login(request, user)
        # 记住登陆 ---设置会话有效期更长
        if remembered == 'on':
            # None 默认有效期2周
            request.session.set_expiry(None)
        # 结果响应
        response = redirect(reverse('contents:index'))
        # 设置cookie 给浏览器渲染登陆页时取数据
        response.set_cookie('username', user.username, max_age=1)
        response = merge_cart_cookie_to_redis(request, user, response)
        return response
예제 #4
0
    def post(self, request):
        # 1.接收参数
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')

        # 2.校验参数
        if not all([username, password]):
            return HttpResponseForbidden('参数不齐全')
            # 2.1 用户名
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return HttpResponseForbidden('请输入5-20个字符的用户名')
            # 2.2 密码
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return HttpResponseForbidden('请输入8-20位的密码')

        # 3.验证用户名和密码--django自带的认证
        from django.contrib.auth import authenticate, login
        user = authenticate(username=username, password=password)

        if user is None:
            return render(request, 'login.html', {'account_errmsg': '用户名或密码错误'})

        # 4.保持登陆状态
        login(request, user)

        # 5.是否记住用户名
        if remembered != 'on':
            # 不记住用户名,浏览器结束会话就过期
            request.session.set_expiry(0)
        else:
            # 记住用户名,浏览器会话保持两周
            request.session.set_expiry(None)
        # 操作 next
        next = request.GET.get('next')

        if next:
            response = redirect(next)
        else:
            response = redirect(reverse('contents:index'))

        response.set_cookie('username', user.username, max_age=3600*24*14)

        # 合并购物车
        merge_cart_cookie_to_redis(request=request, response=response)
        # 6.返回响应结果 
        return response
예제 #5
0
    def post(self, request):
        # 1.接收参数
        mobile = request.POST.get('mobile')
        pwd = request.POST.get('password')
        sms_code_client = request.POST.get('sms_code')
        openid = request.POST.get('openid')

        # 2. 正则校验

        if not openid:
            return render(request, 'oauth_callback.html',
                          {'openid_errmsg': '无效的openid'})

        # 3. 判断 手机号 --存不存在
        # 存在的额=---密码
        try:
            user = User.objects.get(mobile=mobile)
        except User.DoesNotExist:

            # 不存在--新建用户
            user = User.objects.create_user(username=mobile,
                                            password=pwd,
                                            mobile=mobile)
        else:

            if not user.check_password(pwd):
                return render(request, 'oauth_callback.html',
                              {'account_errmsg': '用户名或密码错误'})

        try:
            # 4.绑定openid 操作OAuthQQUser表--新建数据
            OAuthQQUser.objects.create(user=user, openid=openid)
        except DatabaseError:
            return render(request, 'oauth_callback.html',
                          {'qq_login_errmsg': 'QQ登录失败'})

        # 1.保持登录装填
        login(request, user)
        # 2. cookie保存用户名
        response = redirect(reverse('contents:index'))
        response.set_cookie('username',
                            user.username,
                            max_age=14 * 2 * 24 * 3600)
        # 合并购物车
        merge_cart_cookie_to_redis(request=request, response=response)
        # 5.返回首页
        return response
예제 #6
0
    def post(self, request):
        # 1.接收解析参数-请求体form--request.POST
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')

        # 2.校验-判空--正则

        # 3.校验用户名和密码是否正确--User.objects.get(username=username,password=password)
        # django自带的登录函数--authenticate==>如果成功返回user对象, 如果失败None
        from django.contrib.auth import authenticate, login
        user = authenticate(request=request,
                            username=username,
                            password=password)

        # 登录失败
        if user is None:
            return render(request, 'login.html',
                          {'account_errmsg': '用户名或密码错误!'})

        # 4.保持登录状态
        login(request, user)

        # 是否 记住登录--本质 session过期时间
        if remembered == 'on':
            # 记住登录 None 14天
            request.session.set_expiry(None)
        else:
            # 不记住登录
            request.session.set_expiry(0)

        # 设置cookie --username--方便其他前端页面去cookie取值
        next = request.GET.get('next')
        if next:
            response = redirect(next)
        else:
            response = redirect(reverse('contents:index'))
        # response.set_cookie('username', username, max_age=24 * 3600 * 15)
        response.set_cookie('username', user.username, max_age=24 * 3600 * 15)

        # 合并购物车
        from apps.carts.utils import merge_cart_cookie_to_redis
        merge_cart_cookie_to_redis(request, response)

        # 5.重定向到首页
        return response
예제 #7
0
    def post(self, request):
        # 1.接收数据
        data = request.POST
        # 2.获取数据
        username = data.get('username')
        password = data.get('password')
        remembered = data.get('remembered')
        # 3.验证是否齐全(用户名和密码都要传递过来)
        if not all([username, password]):
            return http.HttpResponseBadRequest('缺少必传的参数哦')
        # 4.判断用户名是否符合规则
        if not re.match(r'^[0-9a-zA-Z_-]{5,20}$', username):
            return http.HttpResponseBadRequest('请输入正确的用户名或手机号哦')
        # 5.判断密码是否符合规则
        if not re.match(r'^[0-9a-zA-Z]{8,20}', password):
            return http.HttpResponseBadRequest('密码格式不对哦')
        # 6.验证用户
        user = authenticate(username=username, password=password)
        # 用户名和密码是否正确
        if user is None:
            return render(request, 'login.html',
                          {'login_error_message': '用户名或密码输入有误'})
        # 7.保持会话
        login(request, user)
        if remembered != 'on':
            # set_expiry 设置过期时间
            # 没有记住用户:浏览器关闭就过期
            request.session.set_expiry(0)
        else:
            # 记住用户:None默认表示两周以后过期
            request.session.set_expiry(None)
        #     next设置
        next = request.GET.get('next')
        if next:
            response = redirect(next)
        else:
            response = redirect(reverse('contents:index'))
            # 记住登录(记住密码那个按钮)/不记住登录
            #     返回响应之前设置cooking
        if remembered != 'on':
            # 获取cooking,不记住密码时
            response.set_cookie(
                'username',
                user.username,
            )

        else:
            # 记住密码时
            response.set_cookie('username',
                                user.username,
                                max_age=3600 * 24 * 14)
        # 在这里合并
        response = merge_cart_cookie_to_redis(request=request,
                                              user=user,
                                              response=response)

        # 8.返回相应
        return response
예제 #8
0
    def post(self, request):
        # 接收参数 : username password 记住登录
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')

        # 校验参数
        if not all([username, password]):
            return HttpResponseForbidden('参数不齐全')
        #  用户名
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return HttpResponseForbidden('请输入5-20个字符的用户名')
        #  密码
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return HttpResponseForbidden('请输入8-20位的密码')

        # 验证用户名和密码--django自带的认证
        user = authenticate(username=username, password=password)
        if user is None:
            return render(request, 'login.html',
                          {'account_errmsg': '用户名或密码错误'})
        # 4.保持登录状态
        login(request, user)

        # 5.是否记住用户名
        if remembered != 'on':
            # 不记住用户名, 浏览器结束会话就过期
            request.session.set_expiry(0)
        else:
            # 记住用户名, 浏览器会话保持两周
            request.session.set_expiry(None)

        # next 获取
        next = request.GET.get('next')
        if next:
            response = redirect(reverse('users:info'))

        else:
            response = redirect(reverse('contents:index'))
        response.set_cookie("username", user.username, max_age=14 * 3600 * 24)

        # 调用合并购物车
        merge_cart_cookie_to_redis(request=request, response=response)
        # 6.返回响应结果 跳转首页
        return response
예제 #9
0
    def post(self, request):
        # 接受参数
        mobile = request.POST.get("mobile")
        pwd = request.POST.get("password")
        sms_code_client = request.POST.get("sms_code")
        openid = request.POST.get('openid')
        print(openid)

        # 校验
        # 保存注册数据
        try:
            # 判断数据库中是否存在该用户
            user = User.objects.get(mobile=mobile)
        except Exception as e:
            # 如果用户不存在就新建用户
            user = User.objects.create_user(
                username=mobile,
                password=pwd,
                mobile=mobile,
            )
        else:
            if not user.check_password(pwd):
                return render(request, 'oauth_callback.html',
                              {'account_errmsg': '用户名或密码错误'})
            # 绑定openid
            try:
                OAuthQQUser.objects.create(openid=openid, user=user)
            except Exception as e:
                return render(request, 'oauth_callback.html',
                              {'qq_login_errmsg': 'QQ登录失败'})

            # 保持登陆状态
            login(request, user)

            # 跳转首页
            response = redirect(reverse("users:index"))
            response.set_cookie("username",
                                user.username,
                                max_age=3600 * 12 * 14)

            # 合并购物车
            from apps.carts.utils import merge_cart_cookie_to_redis
            merge_cart_cookie_to_redis(request, response)
            return response
예제 #10
0
    def post(self,request):

        # 接收参数
        username = request.POST.get('username')

        password = request.POST.get('password')

        remembered = request.POST.get('remembered')

        # 校验参数
        if not all([username,password]):
            return http.HttpResponseForbidden("请将信息填写完整!")

        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$',username):
            return http.HttpResponseForbidden("请输入5-20个字符的用户名!")

        if not re.match(r'^[0-9A-Za-z]{8,20}$',password):
            return http.HttpResponseForbidden("请输入8-20个字符的密码!")

        # 校验账户
        from django.contrib.auth import authenticate,login
        user = authenticate(request,username=username,password=password)

        if user is None:

            return render(request,'login.html',{'account_errmsg':"用户名或密码错误"})

        # 保持登陆状态
        login(request,user)

        # 是否记住用户名
        if remembered == 'on':
            request.session.set_expiry(None)

        else:
            request.session.set_expiry(0)

        # 翻转首页 next
        next = request.GET.get('next')
        if next:

            response = redirect(next)
        else:
            response = redirect(reverse('contents:index'))


        # 实现合并购物车
        from apps.carts.utils import merge_cart_cookie_to_redis
        response = merge_cart_cookie_to_redis(request,response,user)


        response.set_cookie('username',user.username,max_age=3600*24*15)

        # 返回响应结果
        return response
예제 #11
0
    def post(self, request):
        # 1.接收三个参数
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')

        # 2.校验参数
        if not all([username, password]):
            return HttpResponseForbidden('参数不齐全')
        # 2.1 用户名
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return HttpResponseForbidden('请输入5-20个字符的用户名')
        # 2.2 密码
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return HttpResponseForbidden('请输入8-20位的密码')

        # 3.验证用户名和密码(数据交互)--django自带的认证 authenticate()
        from django.contrib.auth import authenticate, login
        user = authenticate(username=username, password=password)

        if user is None:
            return render(request, 'login.html', {'account_errmsg': '用户名或密码错误'})

        # 4.保持登录状态: cookie ---session
        # from django.contrib.auth import login
        login(request, user)

        # 5.是否记住用户名
        if remembered != 'on':
            # 不记住用户名, 浏览器结束会话就过期
            request.session.set_expiry(0)
        else:
            # 记住用户名, 浏览器会话保持两周
            request.session.set_expiry(None)

        # 6.返回响应结果  跳转到首页  index
        # 6.1 登录优化--> 未登录--点击个人中心-->登录页面-->个人中心
        # http://www.meiduo.site:8000/login/?next=/info/
        next = request.GET.get('next')
        if next:
            response = redirect(next)
        else:
            response = redirect(reverse('contents:index'))

        # 购物车合并
        # cookie--未登录--笔记本1  黄色2  黑色3  银色1
        # redis----登录---笔记本3  黄色2  黑色1
        # 合并结果---           1     2     3     1
        response = merge_cart_cookie_to_redis(request, user, response)

        # 注册时用户名写入到cookie,有效期15天
        response.set_cookie('username', user.username, max_age=contants.SET_COOKIE_EXPIRE)
        return response
예제 #12
0
    def post(self, request):
        # 1.接收三个参数
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')

        # 2.校验参数
        if not all([username, password]):
            return HttpResponseForbidden('参数不齐全')
        # 2.1 用户名
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return HttpResponseForbidden('请输入5-20个字符的用户名')
        # 2.2 密码
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return HttpResponseForbidden('请输入8-20位的密码')

        # 3.验证用户名和密码--django自带的认证
        from django.contrib.auth import authenticate, login
        user = authenticate(username=username, password=password)

        # 如果user不存在 重新登录 --render login.html
        if user is None:
            return render(request, 'login.html',
                          {'account_errmsg': '用户名或密码错误'})

        # 4.保持登录状态
        login(request, user)

        # 5.是否记住用户名
        if remembered != 'on':
            # 不记住用户名 , 过期时间 0
            request.session.set_expiry(0)
        else:
            # 记住用户名,  过期时间  默认 2周
            request.session.set_expiry(None)

        #接收next的值==路由
        next = request.GET.get('next')
        if next:
            response = redirect(next)
        else:
            # 6.返回响应结果
            response = redirect(reverse('contents:index'))

        #合并购物车
        response = merge_cart_cookie_to_redis(request=request,
                                              user=user,
                                              response=response)

        response.set_cookie('username', username,
                            constants.USERNAME_EXPIRE_TIME)
        return response
예제 #13
0
    def post(self, request):
        '''登录功能'''

        # 1.接收参数
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')

        # 2.校验参数
        if not all([username, password]):
            return http.HttpResponseForbidden('参数不齐全')

        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return http.HttpResponseForbidden('请输入5-20个字符的用户名')

        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return http.HttpResponseForbidden('请输入8-20位的密码')

        # 验证用户名和密码 使用django自带的登录认证
        from django.contrib.auth import authenticate, login
        user = authenticate(username=username, password=password)

        # 校验是否正确
        if user is None:
            return render(request, 'login.html',
                          {'account_errmsg': '用户名或密码错误'})

        # 保持登录状态
        login(request, user)

        # 是否记住用户名
        if remembered != 'on':

            request.session.set_expiry(0)
        else:
            request.session.set_expiry(None)

        # 3响应登录结果
        # 翻转首页
        next = request.GET.get('next')
        if next:
            response = redirect(next)
        else:
            response = redirect(reverse('contents:index'))

        # 合并购物车功能
        response = merge_cart_cookie_to_redis(request, user, response)

        # 登录时用户名写入到cookie,有效期15天
        response.set_cookie('username', user.username, max_age=3600 * 24 * 15)

        return response
예제 #14
0
    def post(self, request):
        """
         1.接收参数
         2.获取参数
         3.判断参数是否齐全
         4.判断用户名是否符合要求
         5.判断密码是否符合要求
         6.根据用户名进行查询
         7.根据是否记住密码设置会话有效期
         8.跳转到首页
        """
        # 1.接收参数
        data = request.POST
        # 2.获取参数
        username = data.get('username')
        password = data.get('password')
        is_remembered = data.get('remembered')
        # 3.判断参数是否齐全
        if not all([username, password, is_remembered]):
            return http.HttpResponseBadRequest('参数不全')
        # 4.判断用户名是否符合要求
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return http.HttpResponseBadRequest('用户名格式不正确')
        # 5.判断密码是否符合要求
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return http.HttpResponseBadRequest('密码格式不正确')
        # 6.进行用户名和密码的验证
        from django.contrib.auth import authenticate
        user = authenticate(request, username=username, password=password)
        if user is None:
            return render(request, 'login.html', {'errmsg': '用户名或密码错误'})
        # 7.根据是否记住密码设置会话有效期
        login(request, user)
        if is_remembered != 'on':
            request.session.set_expiry(0)
        # 8.跳转到首页/next页面
        next = request.GET.get('next')
        if next:
            response = redirect(next)
        else:
            response = redirect(reverse('contents:index'))

        response.set_cookie('username', username, max_age=15 * 24 * 3600)

        response = merge_cart_cookie_to_redis(request=request,
                                              user=user,
                                              response=response)

        return response
예제 #15
0
    def post(self,request):
        #1、接收三个参数
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')
        #2、对接收到的参数进行校验
        #2.1 判断用户名密码是否存在空值,如果存在空值则返回参数不齐全。
        if not all([username,password]):
            return http.HttpResponseForbidden('参数不齐全')
        #2.2 对用户名进行正则校验,判断用户名是否满足长度与字符要求。
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$',username):
            return http.HttpResponseForbidden('请输入5-20个字符的用户名')
        #2.3 对密码进行正则校验,判断密码的长度与字符要求是否满足。
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return http.HttpResponseForbidden('请输入8-20位的密码')


        #3 通过django自带认证系统authenticate验证用户名与密码
        from django.contrib.auth import authenticate,login
        user = authenticate(username=username,password=password)

        if user is None:
            return render(request, 'login.html', {'account_errmsg': '用户名或密码错误'})
        #4 保持登录状态
        login(request,user)

        #判断是否记住用户名,如果自动记住,则保持会话状态,否则当回话结束session就过期
        if remembered != 'on':
            request.session.set_expiry(0)
        else :
            request.session.set_expiry(None)
        #next重定向到指定页面
        next = request.GET.get('next')
        if next:
            response = redirect(next)
        else:
        #首页用户名展示
            response = redirect(reverse('contents:index'))

        #合并邮箱
        response = merge_cart_cookie_to_redis(request=request, user=user, response=response)

        # 注册时用户名写入到cookie,有效期15天
        response.set_cookie('username', user.username, max_age=3600 * 24 * 15)

        return response
예제 #16
0
파일: views.py 프로젝트: Edwin-Joa/meiMall
    def post(self, request):
        dict = json.loads(request.body.decode())
        mobile = dict.get('mobile')
        password = dict.get('password')
        sms_code_client = dict.get('sms_code')
        access_token = dict.get('access_token')

        if not all([mobile, password, sms_code_client]):
            return JsonResponse({'code': 400, 'errmsg': '缺少必传参数'})
        if not re.match('^1[3-9]\d{9}$', mobile):
            return JsonResponse({'code': 400, 'errmsg': '电话号码有误'})
        if not re.match('^[a-zA-Z0-9]{8,20}$', password):
            return JsonResponse({'code': 400, 'errmsg': '密码格式错误'})
        redis_conn = get_redis_connection('verify_code')
        sms_code_server = redis_conn.get(f'sms_code_{mobile}')

        if sms_code_server is None:
            return JsonResponse({'code': 400, 'errmsg': '验证码失效'})
        if sms_code_client != sms_code_server.decode():
            return JsonResponse({'code': 400, 'errmsg': '验证码有误'})
        openid = check_access_token(access_token)

        if not openid:
            return JsonResponse({'code': 400, 'errmsg': '缺少openid'})
        try:
            user = User.objects.get(mobile=mobile)
        except Exception as e:
            user = User.objects.create_user(username=mobile,
                                            password=password,
                                            mobile=mobile)
        else:
            if not user.check_password(password):
                return JsonResponse({'code': 400, 'errmsg': '输入密码有误'})
        try:
            OauthQQUser.objects.create(openid=openid, user=user)
        except Exception as e:
            return JsonResponse({'code': 400, 'errmsg': '存入数据库失败'})
        login(request, user)
        response = JsonResponse({'code': 0, 'errmsg': 'ok'})
        response.set_cookie('username', user.username, max_age=3600 * 24 * 14)
        response = merge_cart_cookie_to_redis(request=request,
                                              user=user,
                                              response=response)

        return response
예제 #17
0
    def post(self, request):
        # 1.获取数据
        username = request.POST.get('username')
        password = request.POST.get('pwd')
        rememberd = request.POST.get('remembered')

        # 2. 验证数据
        if not all([username, password]):
            return HttpResponseBadRequest('参数不全')

        # 3.判断用户名密码是否一致
        from django.contrib.auth import authenticate
        user = authenticate(username=username, password=password)
        if user is None:
            return HttpResponseBadRequest('用户名或密码错误')

        # 4. 状态保持
        login(request, user)

        # 5.记住登录
        if rememberd == 'on':
            # 记住登录,俩周后失效
            request.session.set_expiry(None)
        else:
            # 不记住登录,关闭浏览器失效
            request.session.set_expiry(0)
            # return redirect(reverse('contents:index'))

        ##############首页用户名展示#######################
        # 响应注册结果
        response = redirect(reverse('contents:index'))

        # 设置cookie
        response.set_cookie('username', user.username, max_age=3600 * 24 * 14)

        # #合并购物车
        response = merge_cart_cookie_to_redis(request=request,
                                              user=user,
                                              response=response)
        return response
예제 #18
0
    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')

        if not all([username, password]):
            return HttpResponseBadRequest('参数不全')
        user = authenticate(request, username=username, password=password)

        if user is None:
            return HttpResponseBadRequest('用户名或密码错误')

        login(request, user)

        if remembered == 'on':
            request.session.set_expiry(None)
        else:
            request.session.set_expiry(0)

        response = redirect(reverse('contents:index'))
        response.set_cookie('username', user.username, max_age=3600)
        response = merge_cart_cookie_to_redis(request, user, response)
        return response
예제 #19
0
    def post(self, request):
        """
            需求:
             当用户点击保存的时候,需要让前端将 openid_token,mobile,password,sms_code 提交给后端
             后端:
             大体步骤:
             1.接收数据
             2.验证数据
                手机号
                密码
                短信验证码
                openid_token
            3.绑定信息
                openid      是通过对oepnid_token的解密来获取
                user        需要根据 手机号进行判断
                                如果手机号注册,已经有user信息
                                如果没有注册,我们就创建一个user用户
            4.登陆状态保持
            5.cookie
            6.返回相应
        """
        #1.接受数据
        data = request.POST
        mobile = data.get('mobile')
        password = data.get('password')
        sms_code_client = data.get('sms_code')
        openid_token = data.get('openid')
        if not all([mobile, password, sms_code_client, openid_token]):
            return http.HttpResponseBadRequest('缺少必传的参数哦')
        # 2.1判断手机号是否符合规则
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return http.HttpResponseBadRequest('手机号不满足条件')
        # 2.2验证密码是否符合规则
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return http.HttpResponseBadRequest('密码格式不正确')
        # 连接redis数据库
        # redis_conn = get_redis_connection('code')
        # # 获取redis中的短信验证码
        # sms_code_server = redis_conn.get('sms_%s' % mobile)
        # 判断库中的短信验证码是否过期
        redis_conn = get_redis_connection('code')
        sms_code_server = redis_conn.get('sms_%s' % mobile)
        if sms_code_server is None:
            return http.HttpResponseBadRequest('短信验证码已经过期了')
        # 比对是否一致
        if sms_code_server.decode() != sms_code_client:
            return http.HttpResponseBadRequest('短信验证码不一致哦')
        # 对openid进行解密
        openid = check_openid_token(openid_token)
        # 如果返回一个none,给出错误信息
        if openid is None:
            return http.HttpResponseBadRequest('openid错误')

        # 3.绑定信息(绑定openid和用户信息user)
        try:
            user = User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            # 用户不存在的话,新建用户
            user = User.objects._create_user(username=mobile,
                                             password=password,
                                             mobile=mobile)
        else:
            # 如果用户存在,再次检查用户密码
            if not user.check_password(password):
                return http.HttpResponseBadRequest('密码错误')
#             将用户绑定openid
        try:
            OAuthQQUser.objects.create(openid=openid, user=user)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseBadRequest('数据库错误')
#       4.登录状态保持
        login(request, user)
        #        5.设置cooking
        response = redirect(reverse('contents:index'))
        response.set_cookie('username', user.username, max_age=14 * 24 * 3600)
        #         在这里合并
        response = merge_cart_cookie_to_redis(request=request,
                                              user=user,
                                              response=response)
        #         6.返回响应
        return response
예제 #20
0
파일: views.py 프로젝트: libin-c/Meiduo
    def post(self, request):
        """美多商城用户绑定到openid"""
        # 接收参数
        mobile = request.POST.get('mobile')
        pwd = request.POST.get('password')
        sms_code = request.POST.get('sms_code')
        openid = request.POST.get('openid')
        print(openid)
        openid = SecretOauth().loads(openid)

        # 判断参数是否齐全
        if not all([mobile, pwd]):
            return HttpResponseForbidden('参数不齐')
        # 判断手机号是否合法
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return HttpResponseForbidden('请输入正确的手机号码')
        # 判断密码是否合格
        if not re.match(r'^[0-9A-Za-z]{8,20}$', pwd):
            return HttpResponseForbidden('请输入8-20位的密码')
        # 判断短信验证码是否一致

        sms_code = request.POST.get('msg_code')
        # 6.1 从redis 中取出来
        redis_code_client = get_redis_connection('sms_code')
        redis_code = redis_code_client.get('sms_%s' % mobile)

        if redis_code is None:
            return render(request, 'oauth_callback.html',
                          {'sms_code_errmsg': '无效的短信验证码'})
        if sms_code != redis_code.decode():
            return render(request, 'oauth_callback.html',
                          {'sms_code_errmsg': '输入短信验证码有误'})
        # 判断openid是否有效:错误提示放在sms_code_errmsg位置

        if not openid:
            return render(request, 'oauth_callback.html',
                          {'openid_errmsg': '无效的openid'})

        # 保存注册数据
        try:
            user = User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            # 用户不存在,新建用户
            user = User.objects.create_user(username=mobile,
                                            password=pwd,
                                            mobile=mobile)
        else:
            # 如果用户存在,检查用户密码
            if not user.check_password(pwd):
                return render(request, 'oauth_callback.html',
                              {'account_errmsg': '用户名或密码错误'})

        # 将用户绑定openid
        try:
            OAuthQQUser.objects.create(openid=openid, user=user)
        except Exception as e:
            logger.error(e)
            return render(request, 'oauth_callback.html',
                          {'qq_login_errmsg': 'QQ登录失败'})

        # 实现状态保持
        login(request, user)

        # 响应绑定结果
        next = request.GET.get('state')
        response = redirect(next)
        response = merge_cart_cookie_to_redis(request=request,
                                              user=user,
                                              response=response)

        # 登录时用户名写入到cookie,有效期15天
        response.set_cookie('username', user.username, max_age=3600 * 24 * 15)

        return response
예제 #21
0
    def post(self, request):
        """美多商城用户绑定到openid"""

        # 1.接收参数
        mobile = request.POST.get('mobile')
        pwd = request.POST.get('password')
        sms_code_client = request.POST.get('sms_code')
        openid = request.POST.get('openid')

        # 2.判空正则校验 图片验证 短信验证
        # 判断参数是否齐全
        if not all([mobile, pwd, sms_code_client]):
            return http.HttpResponseForbidden('缺少必传参数')
        # 判断手机号是否合法
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return http.HttpResponseForbidden('请输入正确的手机号码')
        # 判断密码是否合格
        if not re.match(r'^[0-9A-Za-z]{8,20}$', pwd):
            return http.HttpResponseForbidden('请输入8-20位的密码')
        # # 判断短信验证码是否一致
        # redis_conn = get_redis_connection('sms_code')
        # sms_code_server = redis_conn.get('sms_%s' % mobile)
        # if sms_code_server is None:
        #     return render(request, 'oauth_callback.html', {'sms_code_errmsg': '无效的短信验证码'})
        # if sms_code_client != sms_code_server.decode():
        #     return render(request, 'oauth_callback.html', {'sms_code_errmsg': '输入短信验证码有误'})
        # # 解密出openid 再判断openid是否有效
        # openid = SecretOauth().loads(openid).get('openid')
        # if not openid:
        #     return render(request, 'oauth_callback.html', {'openid_errmsg': '无效的openid'})

        # 3.判断user是否存在
        try:
            user = User.objects.get(mobile=mobile)
        except Exception as e:
            # 没注册--> 新注册一个
            user = User.objects.create_user(username=mobile, mobile=mobile, password=pwd)
        else:
            # 注册了--> 校验密码
            if not user.check_password(pwd):
                return render(request, 'oauth_callback.html', {'account_errmsg': '用户名或密码错误'})

        # 4.绑定openid
        try:
            OAuthQQUser.objects.create(user=user, openid=openid)
        except Exception as e:
            return render(request, 'oauth_callback.html', {'qq_login_errmsg': 'QQ登录失败'})

        # 5.重定向到首页
        # 保持登录状态
        login(request, user)
        # 重定向到首页 设置首页用户名
        response = redirect(reverse('contents:index'))

        # 购物车合并
        # cookie--未登录--笔记本1  黄色2  黑色3  银色1
        # redis----登录---笔记本3  黄色2  黑色1
        # 合并结果---           1     2     3     1
        response = merge_cart_cookie_to_redis(request, user, response)

        response.set_cookie('username', user.username, max_age=24 * 14 * 3600)
        return response