from django.shortcuts import render, HttpResponse, redirect
from django.views import View
from users import forms
from users.models import User, Address
from django.contrib.auth import login, authenticate, logout
from django.http import JsonResponse, HttpResponseForbidden
from django_redis import get_redis_connection
from django.contrib.auth.mixins import LoginRequiredMixin
import json, re
from utils.response_code import RETCODE
from django.core.mail import send_mail
from django.conf import settings
from utils.views import LoginRequiredJsonMixin
from users.utils import generate_verify_email_url, check_verify_email_token
class RegisterView(View):
def get(self, request):
# 用于响应用户注册页面
return render(request, 'register.html')
def post(self, request):
# 用户注册信息的校验
# 检验数据 使用自定义的forms表单类校验
# forms表单类接收的数据类型为:字典类型
register_form = forms.RegisterForm(request.POST)
# 校验数据是否合法; 合法则将数据保存到数据库中,注册成功; 不合法则注册失败
# is_valid()
if register_form.is_valid():
# 说明数据合法 , 获取数据
username = register_form.cleaned_data.get('username')
password = register_form.cleaned_data.get('password')
mobile = register_form.cleaned_data.get('mobile')
# 获取用户输入的短信验证码的数据
sms_code_client = register_form.cleaned_data.get('sms_code')
# 获取保存在redis 数据库中的验证码
redis_conn = get_redis_connection('ver_code')
sms_code_server = redis_conn.get('image_%s' % mobile)
# 判断短信验证码是否有效
if sms_code_server is None:
return render(request, 'register.html', {'sms_code_errmsg': '短信验证已失效'})
# 进行校验短信验证码
if sms_code_server.decode() != sms_code_client:
return render(request, 'register.html', {'sms_code_errmsg': '短信验证码错误'})
# 把数据保存到数据库中
try:
user = User.objects.create_user(username=username, password=password, mobile=mobile)
except Exception as e:
return render(request, 'register.html', {'register_error': '注册失败'})
# 实现状态保持
login(request, user)
# 响应数据注册成功
return redirect('index')
else:
# 获取表单错误信息
context = {'forms_error': register_form.errors}
return render(request, 'register.html', context=context)
class UsernameCountView(View):
# 判断用户名是否重复
def get(self, request, username):
# 从请求中获取到用户名
# 从数据库中查看这个用户名是否存在
count = User.objects.filter(username=username).count()
# 前端vue中发送的是ajax请求 , 接收的是json数据
return JsonResponse({'code': 200, 'errmsg': 'OK', 'count': count})
class LoginView(View):
# 用户登录
def get(self, request):
# 实现登录页面
return render(request, 'login.html')
def post(self, request):
# 接收请求找那个的参数进行校验
login_form = forms.LoginForm(request.POST)
# 判断数据是否正确
if login_form.is_valid():
# 提取表单中的数据
username = login_form.cleaned_data.get('username')
password = login_form.cleaned_data.get('password')
remembered = login_form.cleaned_data.get('remembered')
# 判断获取的数据是否全部完整
if not all([username, password]):
return HttpResponseForbidden('缺少必要的数据')
# 认证用户的数据信息是否正确
# authenticate , 用户存在返回用户信息 , 用户不存在返回None
user = authenticate(username=username, password=password)
if user is None:
return render(request, 'login.html', {'account_errmsg': '账号或者密码错误'})
# 保持状态
login(request, user)
if remembered != True:
# 不记住 , 关闭即销毁
request.session.set_expiry(0)
else:
# 记住 , 状态保持默认为两周
request.session.set_expiry(None)
# 接收get请求中的next参数
next = request.GET.get('next')
# 通过get请求判断有没有next参数
if next:
response = redirect(next)
else:
# 重定向到首页
response = redirect('index')
# 讲用户数据写到cookie中
response.set_cookie('username', user.username, 3600)
return response
else:
# 获取表单错误信息
context = {'forms_error': login_form.errors}
return render(request, 'login.html', context=context)
class LogoutView(View):
# 实现用户退出
def get(self, request):
# 清理状态保持的信息数据
logout(request)
# 退出登录重定向页面,登录或者首页
response = redirect('index')
# 删除cookie中的用户信息
response.delete_cookie('username')
# 响应数据
return response
class UserInfoView(LoginRequiredMixin, View):
# 实现用户中心
def get(self, request):
# 获取到用户信息
context = {
"username": request.user.username,
"mobile": request.user.mobile,
"email": request.user.email,
"email_active": request.user.email_active,
}
return render(request, 'user_center_info.html', context=context)
class EmailView(LoginRequiredJsonMixin, View):
# 添加邮箱
def put(self, request):
# put请求的参数数据在request的body中
# 接收参数
json_str = request.body.decode()
json_dict = json.loads(json_str)
email = json_dict.get('email')
# 校验参数
if not re.match('^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
return HttpResponseForbidden('邮箱错误')
# 保存邮箱数据
try:
request.user.email = email
request.user.save()
except Exception:
return JsonResponse({'code': RETCODE.DBERR, 'errmsg': '邮箱添加失败'})
# 发送邮件 , 进行邮箱验证
subject = "邮箱验证激活"
# 调用生成激活链接的方法
verify_url = generate_verify_email_url(request.user)
html_message = f"""
<p>什么 , 你说什么</p>
<p>我说阿宸好帅</p>
<p>你的邮箱{email} , 点击链接确定</p>
<p><a href="{verify_url}">{verify_url}</p>
"""
send_mail(subject, '', from_email=settings.EMAIL_FROM, recipient_list=[email, ],
html_message=html_message)
# 响应页面数据
return JsonResponse({'code': RETCODE.OK, 'errmsg': "OK"})
class VerifyEmailView(View):
# 验证邮箱
def get(self, request):
# 接收路由中的token数据
token = request.GET.get('token')
# 判断路径是否带有token参数
if not token:
return HttpResponseForbidden('缺少token参数')
# 调用解密的方法 , 查询用户数据
user = check_verify_email_token(token)
# 判断用户是否已经进行邮箱
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于Django框架的一个购物商城系统.zip (199个子文件)
main.css 39KB
reset.css 638B
jquery.pagination.css 523B
index.html 15KB
detail.html 12KB
user_center_site.html 8KB
list.html 8KB
place_order.html 6KB
user_center_info.html 6KB
user_center_pass.html 5KB
cart.html 5KB
register.html 5KB
oauth_callback.html 5KB
search.html 4KB
order_success.html 3KB
login.html 3KB
pay_success.html 3KB
404.html 1KB
clock.jpeg 2KB
slide04.jpg 105KB
slide02.jpg 88KB
slide03.jpg 69KB
slide01.jpg 66KB
adv01.jpg 39KB
banner02.jpg 26KB
banner01.jpg 23KB
banner03.jpg 22KB
goods_450.jpg 20KB
bar_code.jpg 19KB
adv02.jpg 17KB
pic_code.jpg 4KB
cat.jpg 4KB
clock.jpg 2KB
left_bg.jpg 1KB
vue-2.5.16.js 283KB
jquery-1.12.4.min.js 95KB
axios-0.18.0.min.js 13KB
user_center_site.js 12KB
cart.js 8KB
register.js 8KB
detail.js 6KB
oauth_callback.js 3KB
jquery.pagination.min.js 3KB
user_center_info.js 3KB
place_order.js 2KB
user_center_pass.js 2KB
list.js 2KB
slide.js 2KB
login.js 2KB
index.js 1KB
order_success.js 1KB
common.js 891B
search.js 171B
login_banner.png 312KB
register_banner.png 54KB
missing.png 52KB
pay_icons.png 12KB
icons.png 8KB
find-password.png 6KB
icons02.png 4KB
success.png 3KB
stars.png 3KB
QQ-weixin.png 2KB
time_count_bg.png 1KB
shop_cart.png 1KB
shine.png 1KB
edit.png 1KB
interval_line.png 1KB
down.png 1KB
selected.png 1KB
arrow.png 985B
views.py 17KB
captcha.py 8KB
models.py 7KB
views.py 6KB
views.py 6KB
settings.py 5KB
views.py 4KB
views.py 3KB
models.py 3KB
models.py 2KB
forms.py 2KB
utils.py 2KB
urls.py 1KB
response_code.py 1KB
ccp_sms.py 1KB
urls.py 1KB
utils.py 816B
manage.py 689B
models.py 602B
urls.py 545B
urls.py 509B
wsgi.py 415B
asgi.py 415B
views.py 392B
model.py 355B
urls.py 290B
urls.py 205B
apps.py 164B
urls.py 156B
共 199 条
- 1
- 2
资源评论
我慢慢地也过来了
- 粉丝: 6514
- 资源: 3999
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 5.23-Java概述,JDK安装及注释、关键字、标识符、数据类型、变量、常量的介绍
- 《Python基础》实验三指导书(1).doc
- TensorFlow 深度学习、机器学习-任何能够用计算流图形来表达的计算,都可以使用TensorFlow
- 2024最新学成在线网页实战项目代码
- 一个基于springboot+sureness的面向REST API资源无状态认证权限管理系统
- 王博外文文献.pdf
- python毕业设计基于社区检测的多任务聚类联邦学习项目源码+使用说明(高分项目).zip
- Javaweb项目源码-编程爱好者博客地带.zip
- java各个技术栈相关知识点
- PYthon代码 pdf合并
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功