本功能实现用到了:模板继承,模板语言,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'))

在线教育项目(三)之登录注册相关推荐

  1. 在线教育项目【用户登录逻辑分析】前端vue

    首先找到login文件夹下面的index.vue页面 找到登录对应的方法 登录方法中:表单校验通过之后将表单信息发送到了vuex中的user.js文件中的login方法进行接收 找到vuex中的use ...

  2. (在线教育)项目总结

    一.在线教育项目功能点(B2C) 1.后台管理系统 1.登录功能(SpringSecurity框架) 2.权限管理功能 (1)菜单管理 列表.添加.修改.删除 (2)角色管理 * 列表.添加.修改.删 ...

  3. 在线教育项目_整体介绍

    在线教育项目_整体介绍 一.项目的背景 二.商业模式 2.1 B2C(该项目的模式) 2.2 B2B2C(商家到商家到用户) 3.功能模块 3.1 系统后台 3.2 系统前台 4.项目使用到的技术 4 ...

  4. 在线教育项目04_讲师管理前端开发

    在线教育项目04_讲师管理前端开发 一.登录功能(临时) 跨域问题 框架使用的过程 二.前端讲师开发 1.讲师列表 2.讲师列表添加分页 3.讲师列表条件查询实现 4.讲师列表删除功能 5.讲师列表删 ...

  5. 在线教育项目02_前端知识(es6、vue)

    在线教育项目02_讲师管理模块 一.统一异常处理的另外两种情况 1.1 特殊异常(特定异常处理) 1.2 自定义异常处理 二.统一日志处理 1.Logback日志工具 三.ECMAScript 6.0 ...

  6. 黑马在线教育项目---5、使用填充器创建数据库数据

    黑马在线教育项目---5.使用填充器创建数据库数据 一.总结 一句话总结: ①创建填充器文件:#php artisan make:seeder ManagerTableSeeder ③执行填充器文件: ...

  7. 黑马在线教育项目---15-16、datatables插件

    黑马在线教育项目---15-16.datatables插件 一.总结 一句话总结: datatables插件也比较好用,引入好插件的js和css后,核心代码也就是插件的初始化,如果要修改配置可以百度 ...

  8. SpringBoot在线教育项目(十一)

    在线教育(十一) 一.服务端渲染技术NUXT-初始化NUXT 一.服务端渲染技术NUXT 二.NUXT环境初始化 三.幻灯片插件 二.首页静态效果整合和NUXT路由 一.页面布局 二.路由 三.封装a ...

  9. 在线教育项目技术笔记2

    文章目录 一.对象存储OSS 1.阿里云OSS控制台使用 2.阿里云OSS开发准备 3.实现代码上传文件到阿里云OSS 二.nginx 1.nginx的启动安装 2.nginx配置项目请求转发 三.e ...

  10. Java在线教育项目 第一天项目介绍和工程搭建

    第一章 项目介绍和工程搭建 学习目标 熟悉移动端应用系统的架构设计 熟悉大型软件系统设计中的各种图形结构 熟悉数据库分库分表设计技巧 熟悉Spring boot2.0+JavaConfig项目封装配置 ...

最新文章

  1. 解决Android 编译出错 找不到android.databinding.ViewDataBinding的类文件
  2. FreeJTS部标视频平台:JT/T808、JT/T809、JT/T796、JT/T794、JT/T1078、苏标ADAS的区别
  3. JavaFX UI控件教程(二十)之HTML Editor
  4. 资源放送丨《MGR原理介绍与案例分享》PPT视频
  5. mysql分组后再分组_全网最全的mysql分组后取topN的解答
  6. 机器翻译学习1:pytorch官方教程与代码逐行详解
  7. python开发软件的实例-如何编写Python软件开发文档(7个技巧)
  8. 版本产品_飞书首次举办产品发布会 新版本“π”正式发布
  9. 「镁客·请讲」归墟电子王景阳:以桌面小型机器人切入市场,沿着“机器人+教育”的方向前进...
  10. 最小二乘法2阶拟合数据
  11. Linux进程的管理与调度(五) -- Linux下0号进程的前世(init_task进程)今生(idle进程)
  12. 解题报告(LeetCode):Max Points on a Line
  13. python语言的赋值语句可以改变变量的类型吗_python 数据类型和变量
  14. android,繁体+代码,2013.08.08——— android 汉语言简繁体转换
  15. 斯坦福大学公开课:编程方法学
  16. html 圣杯布局 高度,圣杯布局——针对前端小白篇
  17. 国标28181:实时视频播放
  18. 靖哥哥教你一步一步安装redis监控redis-stat-超详细
  19. word文档编辑受限制怎么解除?
  20. cf英文名字格式好看的_cf好看的英文名字格式:、I (~) you ?

热门文章

  1. 将网页代码转换成微信小程序代码
  2. python代码扫描工具_用Python编写一个高效的端口扫描器的方法
  3. thinkphp 微信支付
  4. 拼多多上传产品的软件
  5. android nfc 鸡肋,手机NFC真的鸡肋吗?这些功能很实用
  6. 使用devstack在单机上安装openstack(stein版本)和zun的踩坑之路
  7. 干货!On Position Embeddings
  8. 未来公园探索 | 海淀Smart能量公园
  9. 火柴棍等式(暴力枚举)
  10. Torch、Java、Milvus快速搭建以图搜图系统