本功能实现用到了:模板继承,模板语言,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. ExtJs2.0学习系列--Ext.Panel
  2. vue3.0中使用计算属性时报错
  3. Python-自定义函数-参数
  4. vue 自己写组件。
  5. Serval and Toy Bricks
  6. 数据库的使用你可能忽略了这些 (续)
  7. 谈谈你对AOP的理解
  8. EntityFramework Core自动返回SQL语句
  9. java处理unicode_C# JavaScript Java 与 中文 unicode 处理
  10. 啥?这就是一个高级报表/BI数据分析工程师的一天?
  11. Python+tkinter根据窗体大小自动缩放并显示图像
  12. 编译安装android7.0,android7.0 源码编译问题总结
  13. 研磨设计模式之《模板方法模式template method》
  14. carrot 2 LingoClusteringAlgorithm , STCClusteringAlgorithm 和 BisectingKMeansClusteringAlgorithm算法比较
  15. SQL 2012 Management Studio提示无效许可问题解决!!
  16. STM32H750移植STemWin,驱动ST7789
  17. ASAN中无崩溃测试方案实现
  18. 爬取上交所公司信息,根据公司股票代码获取公司注册地址以及地址的经纬度
  19. 5*5盒式滤波器matlab代码
  20. python文本字符分析

热门文章

  1. 怎么给Win10分屏?
  2. 【电源专题】LDO的电源抑制比(PSRR)
  3. Ubuntu20.04下编译测试RocksDB以及遇到的问题记录
  4. static 关键字的详解
  5. 2022最新超级蜘蛛池站群优化网站源码下载
  6. 基于kera-yolo3深度学习框架的目标检测
  7. 芯片驱动之充电芯片2
  8. 基于二阶近似方法的优化算法
  9. 【8008】解决idea中JDBC写sql语句出现报错Unable to resolve table ‘表名‘?
  10. COM单线程套间详解