在线教育项目(三)之登录注册
本功能实现用到了:模板继承,模板语言,ORM,auth和forms组件,总体来说,比较常规的功能,没有新的知识点。新了解的东西就是Django内置了发邮件的功能。
FBV(function base views) 就是在视图里使用函数处理请求。
CBV(class base views) 就是在视图里使用类处理请求。
这个项目使用的是CBV(比较好用)。
设置:
# 静态文件路径
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
一、登录
有两种登录方式:邮箱登录和用户名登录
1、用户名登录(CBV)
后台获取用户提交的用户名和密码,用form组件进行格式校验,再用auth组件校验用户信息,成功则返回首页,失败返回登录页面。
url:
url(r'^login/$', LoginView.as_view(), name='login'),#name可以用于反向查找,即url变化时,代码中不需改动
视图函数:
class LoginView(View):def get(self, request):return render(request, 'login.html')def post(self, request):login_form = LoginForm(request.POST) # 使用forms组件进行格式校验if login_form.is_valid(): # 如果合法username = request.POST.get('username')password = request.POST.get('password')user = auth.authenticate(username=username, password=password)# 使用auth组件进行校验用户信息if user is not None:if user.is_active:auth.login(request, user) # 注册用户后才能使用return redirect(reverse('index'))else:return render(request, "login.html", {"msg": "用户未激活!"})else:return render(request, 'login.html', {'msg': '用户名或密码错误'})else:return render(request, 'login.html', {'login_form': login_form})
2、邮箱登录
class CustomBackend(ModelBackend):# 设置邮箱和用户名都可以登录,重载authenticate方法def authenticate(self, request, username=None, password=None, **kwargs):try:user = UserProfile.objects.get(Q(username=username) | Q(email=username)) # 或# 密码为密文# AbstractUser中有check_password方法if user.check_password(password):return userexcept Exception as e:return None
二、注册
url:
url(r'^register/$', RegisterView.as_view(), name='register'),url(r'^captcha/', include('captcha.urls')), # 验证码url(r'^active/(?P<active_code>.*)/$', ActiveUserView.as_view(), name="user_active"), # 用户激活,active_code是传递的参数
步骤:1、同样需要使用forms组件
# 自定义注册
class RegisterForm(forms.Form):email = forms.CharField(required=True)password = forms.CharField(required=True, max_length=6)captcha = CaptchaField(error_messages={'invalid': '验证码错误'})
2、后台获取用户提交的信息,首先检查这个用户是否注册过(也可以在前端页面注册时,发送ajax请求进行检查),检查通过,则在数据库中创建用户
class RegisterView(View):def get(self, request):register_form = RegisterForm()return render(request, 'register.html', locals())def post(self, request):register_form = RegisterForm(request.POST)if register_form.is_valid():# 校验通过email = request.POST.get('email')pwd = request.POST.get('password')# 检查这个用户名是否已经注册过flag = UserProfile.objects.filter(email=email)if flag:return render(request, 'register.html', {'register_form': register_form, 'msg': '用户已经注册'})# 密码加密pwd = make_password(pwd)# 创建新用户# print(email, pwd)UserProfile.objects.create(username=email, email=email, is_active=False, password=pwd)
# 发送注册邮件email_body, email_title, email_url = send_register_email(email, 'register')# return redirect(reverse('login'))a = mark_safe("{0}<a href='{1}'>{2}</a>".format(email_body, email_url, email_url))return render(request, 'active.html', locals())return render(request, "register.html", {"register_form": register_form})
3、创建用户之后,用户的状态是未激活,原教程是发送邮件进行激活,我使用邮件激活,没有成功,所以我是新建一个页面,页面中有一个激活链接,点击后,用户状态激活。
# 获取随机字符串
def get_random(length=8):random = str(uuid.uuid1())code = random[0:length]return codedef send_register_email(email, send_type='register'):email_record = EmailVerifyRecord()if send_type == 'update_email':code = get_random(4)code = code.replace('-', '') # 去除横杠else:code = get_random(16)code = code.replace('-', '')email_record.code = codeemail_record.email = emailemail_record.send_type = send_typeemail_record.save()email_title = ""email_body = ""if send_type == 'register':email_title = "icourse注册激活"email_body = "请点击下面的链接激活你的账号"email_url = "http://127.0.0.1:8000/active/{0}".format(code) # 忘写端口了,我套# send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) # 邮件发送不成功,自己写个页面,进行验证# if send_status:# passreturn email_body, email_title, email_url
三、忘记密码
url:
url(r'^forget/$', ForgetView.as_view(), name='forget_pwd'),url(r'^reset/(?P<active_code>.*)/$', ResetView.as_view(), name='reset_pwd'), # 重置密码链接url(r'^modify_pwd/$', ModifyPwdView.as_view(), name="modify_pwd"), # 修改密码链接
1、用户点击忘记密码,转到找回密码页面,用户提交信息,用forms组件进行格式校验,
# 忘记密码
class ForgetForm(forms.Form):email = forms.CharField(required=True)captcha = CaptchaField(error_messages={'invalid': '验证码错误'})
2、格式校验通过,向后台发送post请求,获取用户数据
# 找回密码
class ForgetView(View):def get(self, request):forget_form = ForgetForm()print('in get')return render(request, 'forgetpwd.html', locals())def post(self, request):forget_form = ForgetForm(request.POST)print('in post')if forget_form.is_valid():email = request.POST.get('email')email_body, email_title, email_url = send_register_email(email, 'forget')# 生成链接a = mark_safe("{0}<a href='{1}'>{2}</a>".format(email_body, email_url, email_url))return render(request, 'reset_link.html', locals())return render(request, 'forgetpwd.html', locals()) # 提交数据的格式不正确,重新提交
3、发起一个重置密码请求,进入重置密码页面,用户点击链接,返回修改密码页面
class ResetView(View):# 点击重置密码链接,进入此逻辑,返回重置密码页面def get(self, request, active_code):obj = EmailVerifyRecord.objects.filter(code=active_code).first() # 找到有没有重置密码的对象if obj:email=obj.emailreturn render(request, 'password_reset.html', locals()) # 返回重置密码页面else:return render(request, 'register.html')
4、修改密码
# 修改密码
class ModifyPwdView(View):def post(self, request):modify_form = ModifyPwdForm(request.POST)if modify_form.is_valid():pwd1 = request.POST.get('password1')pwd2 = request.POST.get('password2')email = request.POST.get('email')if pwd1 != pwd2:return render(request, 'password_reset.html', {'email': email, 'msg': '密码不一致'})user_obj = UserProfile.objects.filter(email=email).first()user_obj.password = make_password(pwd1)user_obj.save()return render(request, 'login.html')else:email = request.POST.get('email')return render(request,'password_reset.html',locals())
四、退出登录
class LogoutView(View):def get(self, request):auth.logout(request)return redirect(reverse('index'))
在线教育项目(三)之登录注册相关推荐
- 在线教育项目【用户登录逻辑分析】前端vue
首先找到login文件夹下面的index.vue页面 找到登录对应的方法 登录方法中:表单校验通过之后将表单信息发送到了vuex中的user.js文件中的login方法进行接收 找到vuex中的use ...
- (在线教育)项目总结
一.在线教育项目功能点(B2C) 1.后台管理系统 1.登录功能(SpringSecurity框架) 2.权限管理功能 (1)菜单管理 列表.添加.修改.删除 (2)角色管理 * 列表.添加.修改.删 ...
- 在线教育项目_整体介绍
在线教育项目_整体介绍 一.项目的背景 二.商业模式 2.1 B2C(该项目的模式) 2.2 B2B2C(商家到商家到用户) 3.功能模块 3.1 系统后台 3.2 系统前台 4.项目使用到的技术 4 ...
- 在线教育项目04_讲师管理前端开发
在线教育项目04_讲师管理前端开发 一.登录功能(临时) 跨域问题 框架使用的过程 二.前端讲师开发 1.讲师列表 2.讲师列表添加分页 3.讲师列表条件查询实现 4.讲师列表删除功能 5.讲师列表删 ...
- 在线教育项目02_前端知识(es6、vue)
在线教育项目02_讲师管理模块 一.统一异常处理的另外两种情况 1.1 特殊异常(特定异常处理) 1.2 自定义异常处理 二.统一日志处理 1.Logback日志工具 三.ECMAScript 6.0 ...
- 黑马在线教育项目---5、使用填充器创建数据库数据
黑马在线教育项目---5.使用填充器创建数据库数据 一.总结 一句话总结: ①创建填充器文件:#php artisan make:seeder ManagerTableSeeder ③执行填充器文件: ...
- 黑马在线教育项目---15-16、datatables插件
黑马在线教育项目---15-16.datatables插件 一.总结 一句话总结: datatables插件也比较好用,引入好插件的js和css后,核心代码也就是插件的初始化,如果要修改配置可以百度 ...
- SpringBoot在线教育项目(十一)
在线教育(十一) 一.服务端渲染技术NUXT-初始化NUXT 一.服务端渲染技术NUXT 二.NUXT环境初始化 三.幻灯片插件 二.首页静态效果整合和NUXT路由 一.页面布局 二.路由 三.封装a ...
- 在线教育项目技术笔记2
文章目录 一.对象存储OSS 1.阿里云OSS控制台使用 2.阿里云OSS开发准备 3.实现代码上传文件到阿里云OSS 二.nginx 1.nginx的启动安装 2.nginx配置项目请求转发 三.e ...
- Java在线教育项目 第一天项目介绍和工程搭建
第一章 项目介绍和工程搭建 学习目标 熟悉移动端应用系统的架构设计 熟悉大型软件系统设计中的各种图形结构 熟悉数据库分库分表设计技巧 熟悉Spring boot2.0+JavaConfig项目封装配置 ...
最新文章
- 解决Android 编译出错 找不到android.databinding.ViewDataBinding的类文件
- FreeJTS部标视频平台:JT/T808、JT/T809、JT/T796、JT/T794、JT/T1078、苏标ADAS的区别
- JavaFX UI控件教程(二十)之HTML Editor
- 资源放送丨《MGR原理介绍与案例分享》PPT视频
- mysql分组后再分组_全网最全的mysql分组后取topN的解答
- 机器翻译学习1:pytorch官方教程与代码逐行详解
- python开发软件的实例-如何编写Python软件开发文档(7个技巧)
- 版本产品_飞书首次举办产品发布会 新版本“π”正式发布
- 「镁客·请讲」归墟电子王景阳:以桌面小型机器人切入市场,沿着“机器人+教育”的方向前进...
- 最小二乘法2阶拟合数据
- Linux进程的管理与调度(五) -- Linux下0号进程的前世(init_task进程)今生(idle进程)
- 解题报告(LeetCode):Max Points on a Line
- python语言的赋值语句可以改变变量的类型吗_python 数据类型和变量
- android,繁体+代码,2013.08.08——— android 汉语言简繁体转换
- 斯坦福大学公开课:编程方法学
- html 圣杯布局 高度,圣杯布局——针对前端小白篇
- 国标28181:实时视频播放
- 靖哥哥教你一步一步安装redis监控redis-stat-超详细
- word文档编辑受限制怎么解除?
- cf英文名字格式好看的_cf好看的英文名字格式:、I (~) you ?