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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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