一、账号登录

1.1用户名登录

1. 用户名登录逻辑分析

2. 用户名登录接口设计   【仍在user子项目中】

1.请求方式

选项 方案
请求方法 POST
请求地址 /login/

urls.py

#  用户登录url(r'^login/$', views.LoginView.as_view(), name='login'),

2.请求参数:表单

参数名 类型 是否必传 说明
username string 用户名
password string 密码
remembered string 是否记住用户  【就是相当状态保持,控制时间长短】

3.响应结果:HTML

字段 说明
登录失败 响应错误提示
登录成功 重定向到首页

3. 用户名登录接口定义

class LoginView(View):"""用户名登录"""def get(self, request):"""提供登录界面:param request: 请求对象:return: 登录界面"""passdef post(self, request):"""实现登录逻辑:param request: 请求对象:return: 登录结果"""pass

4. 用户名登录后端逻辑

from django.contrib.auth import login, authenticateclass LoginView(View):"""用户名登录"""def get(self, request):"""提供登录界面:param request: 请求对象:return: 登录界面"""return render(request, 'login.html')def post(self, request):"""实现登录逻辑:param request: 请求对象:return: 登录结果"""# 接受参数username = request.POST.get('username')password = request.POST.get('password')remembered = request.POST.get('remembered')# 校验参数# 判断参数是否齐全if not all([username, password]):return http.HttpResponseForbidden('缺少必传参数')# 判断用户名是否是5-20个字符if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):return http.HttpResponseForbidden('请输入正确的用户名或手机号')# 判断密码是否是8-20个数字if not re.match(r'^[0-9A-Za-z]{8,20}$', password):return http.HttpResponseForbidden('密码最少8位,最长20位')# 认证登录用户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:# 记住用户:None表示两周后过期request.session.set_expiry(None)# 响应登录结果return redirect(reverse('contents:index'))

5. 知识要点

  1. 登录的核心思想:认证和状态保持

    • 通过用户的认证,确定该登录用户是美多商场的注册用户。
    • 通过状态保持缓存用户的唯一标识信息,用于后续是否登录的判断。

将login.html和login.js文件添加到项目:

1.2 多账号登录

  • Django自带的用户认证后端默认是使用用户名实现用户认证的。

  • 用户认证后端位置:django.contrib.auth.backends.ModelBackend。

  • 如果想实现用户名和手机号都可以认证用户,就需要自定义用户认证后端。

  • 自定义用户认证后端步骤

    • 在users应用中新建utils.py文件
    • 新建类,继承自ModelBackend
    • 重写认证authenticate()方法
    • 分别使用用户名和手机号查询用户
    • 返回查询到的用户实例

1. 自定义用户认证后端

users.utils.py

from django.contrib.auth.backends import ModelBackend
import re
from .models import Userdef get_user_by_account(account):"""根据account查询用户:param account: 用户名或者手机号:return: user"""try:if re.match('^1[3-9]\d{9}$', account):# 手机号登录user = User.objects.get(mobile=account)else:# 用户名登录user = User.objects.get(username=account)except User.DoesNotExist:return Noneelse:return userclass UsernameMobileAuthBackend(ModelBackend):"""自定义用户认证后端"""def authenticate(self, request, username=None, password=None, **kwargs):"""重写认证方法,实现多账号登录:param request: 请求对象:param username: 用户名:param password: 密码:param kwargs: 其他参数:return: user"""# 根据传入的username获取user对象。username可以是手机号也可以是账号user = get_user_by_account(username)# 校验user是否存在并校验密码是否正确if user and user.check_password(password):return user

2. 配置自定义用户认证后端

1.Django自带认证后端源码

2.配置自定义用户认证后端

# 指定自定义的用户认证后端
AUTHENTICATION_BACKENDS = ['users.utils.UsernameMobileAuthBackend']

3. 测试自定义用户认证后端

4. 知识要点

  1. Django自带的用户认证系统只会使用用户名去认证一个用户。
  2. 所以我们为了实现多账号登录,就可以自定义认证后端,采用其他的唯一信息去认证一个用户。

1.3 首页用户名展示

1. 首页用户名展示方案

方案一

  • 模板中 request 变量直接渲染用户名
  • 缺点:不方便做首页静态化
{% if user.is_authenticated %}<div class="login_btn fl">欢迎您:<em>{{ user.username }}</em><span>|</span><a href="#">退出</a></div>{% else %}<div class="login_btn fl"><a href="login.html">登录</a><span>|</span><a href="register.html">注册</a></div>
{% endif %}

方案二

  • 发送ajax请求获取用户信息
  • 缺点:需要发送网络请求
<div class="login_btn fl">{# ajax渲染 #}
</div>

方案三    【利用缓存来做】

  • Vue读取cookie渲染用户信息
<div v-if="username" class="login_btn fl">欢迎您:<em>[[ username ]]</em><span>|</span><a href="#">退出</a>
</div>
<div v-else class="login_btn fl"><a href="login.html">登录</a><span>|</span><a href="register.html">注册</a>
</div>

结论:

  • 对比此三个方案,我们在本项目中选择 方案三

实现步骤:

  • 注册或登录后,用户名写入到cookie
  • Vue渲染主页用户名

2. 用户名写入到cookie

# 响应注册结果
response = redirect(reverse('contents:index'))# 注册时用户名写入到cookie,有效期15天
response.set_cookie('username', user.username, max_age=3600 * 24 * 15)return response

# 响应登录结果
response = redirect(reverse('contents:index'))# 登录时用户名写入到cookie,有效期15天
response.set_cookie('username', user.username, max_age=3600 * 24 * 15)return response

3. Vue渲染首页用户名

1.index.html

<div v-if="username" class="login_btn fl">欢迎您:<em>[[ username ]]</em><span>|</span><a href="#">退出</a>
</div>
<div v-else class="login_btn fl"><a href="login.html">登录</a><span>|</span><a href="register.html">注册</a>
</div>

2.index.js

mounted(){// 获取cookie中的用户名this.username = getCookie('username');
},

1.4 退出登录

1. logout()方法介绍

  1. 退出登录:

    • 回顾登录:将通过认证的用户的唯一标识信息,写入到当前session会话中
    • 退出登录:正好和登录相反(清理session会话信息)
  2. logout()方法:

    • Django用户认证系统提供了logout()方法
    • 封装了清理session的操作,帮助我们快速实现登出一个用户
  3. logout()位置:

    • django.contrib.auth.__init__.py文件中
logout(request)

2. logout()方法使用

view.py

from django.contrib.auth import login, authenticate, logoutclass LogoutView(View):"""退出登录"""def get(self, request):"""实现退出登录逻辑"""# 清理sessionlogout(request)# 退出登录,重定向到登录页response = redirect(reverse('contents:index'))# 退出登录时清除cookie中的usernameresponse.delete_cookie('username')return response

index.html

3. 知识要点

  1. 退出登录的核心思想就是清理登录时缓存的状态保持信息。
  2. 由于首页中用户名是从cookie中读取的。所以退出登录时,需要将cookie中用户名清除。

1.5 判断用户是否登录

1. 展示用户中心界面

view.py

class UserInfoView(View):"""用户中心"""def get(self, request):"""提供个人信息界面"""return render(request, 'user_center_info.html')

【同时将user_center_info.html和user_center_info.js文件放到项目中】

urls.py

    #  用户中心url(r'^info/$', views.UserInfoView.as_view(), name='info'),

需求:

  • 当用户登录后,才能访问用户中心。
  • 如果用户未登录,就不允许访问用户中心,将用户引导到登录界面。

实现方案:

  • 需要判断用户是否登录。
  • 根据是否登录的结果,决定用户是否可以访问用户中心。

2. is_authenticate 判断用户是否登录

介绍:

  • Django用户认证系统提供了方法request.user.is_authenticated()来判断用户是否登录。
  • 如果通过登录验证则返回True。反之,返回False
  • 缺点:登录验证逻辑很多地方都需要,所以该代码需要重复编码好多次。
class UserInfoView(View):"""用户中心"""def get(self, request):"""提供个人信息界面"""if request.user.is_authenticated():return render(request, 'user_center_info.html')else:return redirect(reverse('users:login'))

3. login_required装饰器 判断用户是否登录

  • Django用户认证系统提供了装饰器login_required来判断用户是否登录。

    • 内部封装了is_authenticate
    • 位置:django.contrib.auth.decorators
  • 如果通过登录验证则进入到视图内部,执行视图逻辑。
  • 如果未通过登录验证则被重定向到LOGIN_URL配置项指定的地址。
    • 如下配置:表示当用户未通过登录验证时,将用户重定向到登录页面。

      LOGIN_URL = '/login/'
      

1.装饰as_view()方法返回值

提示:

  • login_required装饰器可以直接装饰函数视图,但是本项目使用的是类视图。
  • as_view()方法的返回值就是将类视图转成的函数视图。

结论:

  • 要想使用login_required装饰器装饰类视图,可以间接的装饰as_view()方法的返回值,以达到预期效果。
url(r'^info/$', login_required(views.UserInfoView.as_view()), name='info'),
class UserInfoView(View):"""用户中心"""def get(self, request):"""提供个人信息界面"""return render(request, 'user_center_info.html')

2.定义View子类封装login_required装饰器

  • 提示:LoginRequired(object)依赖于视图类View,复用性很差。
url(r'^info/$', views.UserInfoView.as_view(), name='info'),
class LoginRequired(View):"""验证用户是否登陆"""@classmethoddef as_view(cls, **initkwargs):# 自定义as_view()方法中,调用父类的as_view()方法view = super().as_view()return login_required(view)class UserInfoView(LoginRequired):"""用户中心"""def get(self, request):"""提供个人信息界面"""return render(request, 'user_center_info.html')

3.定义obejct子类封装login_required装饰器

  • 提示:LoginRequired(object)不依赖于任何视图类,复用性更强。
url(r'^info/$', views.UserInfoView.as_view(), name='info'),
class LoginRequired(object):"""验证用户是否登陆"""@classmethoddef as_view(cls, **initkwargs):# 自定义as_view()方法中,调用父类的as_view()方法view = super().as_view()return login_required(view)class UserInfoView(LoginRequired, View):"""用户中心"""def get(self, request):"""提供个人信息界面"""return render(request, 'user_center_info.html')

4.定义验证用户是否登录扩展类

  • 提示:定义扩展类方便项目中导入和使用(meiduo_mall.utils.views.py)
  • from django.contrib.auth.mixins import LoginRequiredMixin

直接调用下面的类方法

class LoginRequiredMixin(object):"""验证用户是否登录扩展类"""@classmethoddef as_view(cls, **initkwargs):# 自定义的as_view()方法中,调用父类的as_view()方法view = super().as_view()return login_required(view)
 class UserInfoView(LoginRequiredMixin, View):"""用户中心"""def get(self, request):"""提供个人信息界面"""return render(request, 'user_center_info.html')

4. 登录时next参数的使用

1.next参数的效果

http://127.0.0.1:8000/login/?next=/info/

2.next参数的作用

  • 由Django用户认证系统提供,搭配login_required装饰器使用。
  • 记录了用户未登录时访问的地址信息,可以帮助我们实现在用户登录成功后直接进入未登录时访问的地址。
# 响应登录结果
next = request.GET.get('next')  # 简单理解,从哪儿来到哪儿去
if next:response = redirect(next)
else:response = redirect(reverse('contents:index'))

5. 知识要点

  1. 判断用户是否登录依然使用状态保持信息实现。
  2. 项目中很多接口都是需要用户登录才能访问的,所以为了方便编码,我们将判断用户登录的操作封装到装饰器中。
  3. 登录时next参数的作用是为了方便用户从哪里进入到登录页面,登录成功后就回到哪里。

美多商城之用户登录(账号登录)相关推荐

  1. 美多商城之用户登录(QQ登录)

    二.QQ登录 2.1 QQ登录开发文档 QQ登录:即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目. 1. QQ互联开发者申请步骤 若想实现QQ登录,需 ...

  2. 美多商城之用户中心(添加和验证邮箱)

    二.添加和验证邮箱 2.1 添加邮箱后端逻辑 1. 添加邮箱接口设计和定义 1.请求方式 选项 方案 请求方法 PUT 请求地址 /emails/ # 添加邮箱url(r'^emails/$', vi ...

  3. Python_美多商城(用户中心)_5

    用户基本信息 用户基本信息逻辑分析 1. 用户基本信息逻辑分析 以下是要实现的后端逻辑 用户模型补充email_active字段 查询并渲染用户基本信息 添加邮箱 发送邮箱验证邮件 验证邮箱 提示: ...

  4. 美多商城之用户中心(修改密码)

    修改密码 1. 修改密码后端逻辑 提示: 修改密码前需要校验原始密码是否正确,以校验修改密码的用户身份. 如果原始密码正确,再将新的密码赋值给用户. class ChangePasswordView( ...

  5. 美多商城之用户中心(收货地址3)

    三.收货地址 3.4 修改地址前后端逻辑 1. 修改地址接口设计和定义 1.请求方式 选项 方案 请求方法 PUT 请求地址 /addresses/(?P<address_id>\d+)/ ...

  6. 美多商城之用户中心(收货地址2)

    三.收货地址 3.2 新增地址前后端逻辑 1. 定义用户地址模型类 1.用户地址模型类 from meiduo_mall.utils.models import BaseModelclass Addr ...

  7. 美多商城之用户中心(收货地址1)

    三.收货地址 用户地址的主要业务逻辑有: 展示省市区数据 用户地址的增删改查处理 设置默认地址 设置地址标题 3.1 省市区三级联动 1. 展示收货地址界面 提示: 省市区数据是在收货地址界面展示的, ...

  8. 美多商城之用户中心(用户基本信息)

    一.用户基本信息 1.1用户基本信息逻辑分析 1. 用户基本信息逻辑分析 以下是要实现的后端逻辑 用户模型补充email_active字段 查询并渲染用户基本信息 添加邮箱 发送邮箱验证邮件 验证邮箱 ...

  9. 医美面膜商城小程序开发,助力企业数字化转型

    爱美之心人皆有之,在"颜值即正义"的社会竞争中,从基础的减肥化妆,到深入的美容整形,医美服务一度成为最炙手可热的发展行业.医美产品也受到越来越多人的喜爱,医美面膜就是其中一员,面膜 ...

最新文章

  1. Exchange Server 2013 安装完成后配置外部URL
  2. mysql时间戳group by操作,mysql使用FROM_UNIXTIME将时间戳按日期group by
  3. linux ssh和sftp区别,使用 SSH 和 SFTP 协议
  4. pythonista3使用教程-pythonista3都能做什么
  5. c语言首尾指针相同 则,6.C语言指针练习题.doc
  6. stand up meeting 12/25/2015 weekend 12/26/2015~12/27/2015
  7. 数据:ContentResolver类
  8. rtt 打印 float
  9. php授权验证系统 c,OAuth 2.0 授权码认证
  10. PHP5异常处理,PHP5异常处理分析实例
  11. 数据结构与算法之间的关系
  12. 1095 解码PAT准考证 (25分)
  13. Java项目性能监控和调优工具-Javamelody
  14. CTF-bacon(培根密码)
  15. 10款优秀的在线格式转化器
  16. TILERA--Makefile实例
  17. (小知识点) textview.setBackground不起作用
  18. android 加速度传感器测步数,基于加速度传感器的运动步数检测算法研究
  19. uni-app学习 style样式和三元运算符用法(三)
  20. LabWindows界面的程序控制

热门文章

  1. 微软全球副总裁洪小文:应对数字化转型挑战,跨界共创正当时
  2. Python 的一万种用法:生成字符视频
  3. 明年,我要用 AI 给全村写对联
  4. 通向人工智能产业落地化的道路在哪?
  5. 朋友圈装死,微博蹦迪,Python教你如何掌握女神情绪变化 | CSDN博文精选
  6. 还在纠结垃圾分类问题?带你用Python感受ImageNet冠军模型SENet的强大
  7. 赛灵思:人工智能芯片发展方向与误区
  8. 马斯克连发三推,发布退出OpenAI内情
  9. 薅资本主义羊毛新姿势,英伟达GPU免费用
  10. 百度为AI开发者打造别样的深度学习快速通关路径