ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Django开发】0到1开发美多shop项目:用户登录模块开发。全md文档笔记(附 [打印本页]

作者: 徐锦洪    时间: 2024-5-9 06:08
标题: 【Django开发】0到1开发美多shop项目:用户登录模块开发。全md文档笔记(附

本系列文章md笔记(已分享)主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目(4.0版本)含代码和文档。功能包括前后端不分离,方便SEO。采用Django + Jinja2模板引擎 + Vue.js实现前后端逻辑,Nginx服务器(反向代理)Nginx服务器(静态首页、商品详情页、uwsgi服务器(美多商场业务场景),后端服务:MySQL、Redis、Celery、RabbitMQ、Docker、FastDFS、Elasticsearch、Crontab,外部接口:容联云、QQ互联、支付宝。

仓库里完整资料代码:

请移步这里获取文档和代码

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~

共 11 章,132 子模块



账号登录

用户名登录

1. 用户名登录逻辑分析


2. 用户名登录接口设计

1.请求方式
选项方案请求方法POST请求地址/login/2.请求参数:表单
参数名类型是否必传说明usernamestring是用户名passwordstring是密码rememberedstring是是否记住用户3.响应结果:HTML
字段说明登录失败响应错误提示登录成功重定向到首页3. 用户名登录接口定义
  1. class LoginView(View):
  2.     """用户名登录"""
  3.     def get(self, request):
  4.         """
  5.         提供登录界面
  6.         :param request: 请求对象
  7.         :return: 登录界面
  8.         """
  9.         pass
  10.     def post(self, request):
  11.         """
  12.         实现登录逻辑
  13.         :param request: 请求对象
  14.         :return: 登录结果
  15.         """
  16.         pass
复制代码
4. 用户名登录后端逻辑
  1. class LoginView(View):
  2.     """用户名登录"""
  3.     def get(self, request):
  4.         """
  5.         提供登录界面
  6.         :param request: 请求对象
  7.         :return: 登录界面
  8.         """
  9.         return render(request, 'login.html')
  10.     def post(self, request):
  11.         """
  12.         实现登录逻辑
  13.         :param request: 请求对象
  14.         :return: 登录结果
  15.         """
  16.         # 接受参数
  17.         username = request.POST.get('username')
  18.         password = request.POST.get('password')
  19.         remembered = request.POST.get('remembered')
  20.         # 校验参数
  21.         # 判断参数是否齐全
  22.         if not all([username, password]):
  23.             return http.HttpResponseForbidden('缺少必传参数')
  24.         # 判断用户名是否是5-20个字符
  25.         if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
  26.             return http.HttpResponseForbidden('请输入正确的用户名或手机号')
  27.         # 判断密码是否是8-20个数字
  28.         if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
  29.             return http.HttpResponseForbidden('密码最少8位,最长20位')
  30.         # 认证登录用户
  31.         user = authenticate(username=username, password=password)
  32.         if user is None:
  33.             return render(request, 'login.html', {'account_errmsg': '用户名或密码错误'})
  34.         # 实现状态保持
  35.         login(request, user)
  36.         # 设置状态保持的周期
  37.         if remembered != 'on':
  38.             # 没有记住用户:浏览器会话结束就过期
  39.             request.session.set_expiry(0)
  40.         else:
  41.             # 记住用户:None表示两周后过期
  42.             request.session.set_expiry(None)
  43.         # 响应登录结果
  44.         return redirect(reverse('contents:index'))
复制代码
5. 知识要点

多账号登录

1. 自定义用户认证后端

users.utils.py
  1. from django.contrib.auth.backends import ModelBackend
  2. import re
  3. from .models import User
  4. def get_user_by_account(account):
  5.     """
  6.     根据account查询用户
  7.     :param account: 用户名或者手机号
  8.     :return: user
  9.     """
  10.     try:
  11.         if re.match('^1[3-9]\d{9}$', account):
  12.             # 手机号登录
  13.             user = User.objects.get(mobile=account)
  14.         else:
  15.             # 用户名登录
  16.             user = User.objects.get(username=account)
  17.     except User.DoesNotExist:
  18.         return None
  19.     else:
  20.         return user
  21. class UsernameMobileAuthBackend(ModelBackend):
  22.     """自定义用户认证后端"""
  23.     def authenticate(self, request, username=None, password=None, **kwargs):
  24.         """
  25.         重写认证方法,实现多账号登录
  26.         :param request: 请求对象
  27.         :param username: 用户名
  28.         :param password: 密码
  29.         :param kwargs: 其他参数
  30.         :return: user
  31.         """
  32.         # 根据传入的username获取user对象。username可以是手机号也可以是账号
  33.         user = get_user_by_account(username)
  34.         # 校验user是否存在并校验密码是否正确
  35.         if user and user.check_password(password):
  36.             return user
复制代码
2. 配置自定义用户认证后端

1.Django自带认证后端源码

2.配置自定义用户认证后端
  1.   
  2.   
  3. # 指定自定义的用户认证后端
  4.   
  5.   
  6. AUTHENTICATION_BACKENDS = ['users.utils.UsernameMobileAuthBackend']
复制代码
3. 测试自定义用户认证后端


4. 知识要点

首页用户名展示


1. 首页用户名展示方案

方案一
  1. {% if user.is_authenticated %}
  2.    
  3.         欢迎您:<em>{{ user.username }}</em>
  4.         |
  5.         <a target="_blank" href="https://www.cnblogs.com/#">退出</a>
  6.    
  7.     {% else %}
  8.    
  9.         <a target="_blank" href="https://www.cnblogs.com/login.html">登录</a>
  10.         |
  11.         <a target="_blank" href="https://www.cnblogs.com/register.html">注册</a>
  12.    
  13. {% endif %}
复制代码
方案二
  1.     {# ajax渲染 #}
复制代码
方案三
  1.     欢迎您:<em>[[ username ]]</em>
  2.     |
  3.     <a target="_blank" href="https://www.cnblogs.com/#">退出</a>
  4.     <a target="_blank" href="https://www.cnblogs.com/login.html">登录</a>
  5.     |
  6.     <a target="_blank" href="https://www.cnblogs.com/register.html">注册</a>
复制代码
结论:
实现步骤:
2. 用户名写入到cookie
  1.   
  2.   
  3. # 响应注册结果
  4.   
  5.   
  6. response = redirect(reverse('contents:index'))
  7.   
  8.   
  9. # 注册时用户名写入到cookie,有效期15天
  10.   
  11.   
  12. response.set_cookie('username', user.username, max_age=3600 * 24 * 15)
  13. return response
复制代码
  1.   
  2.   
  3. # 响应登录结果
  4.   
  5.   
  6. response = redirect(reverse('contents:index'))
  7.   
  8.   
  9. # 登录时用户名写入到cookie,有效期15天
  10.   
  11.   
  12. response.set_cookie('username', user.username, max_age=3600 * 24 * 15)
  13. return response
复制代码
3. Vue渲染首页用户名

1.index.html
  1.     欢迎您:<em>[[ username ]]</em>
  2.     |
  3.     <a target="_blank" href="https://www.cnblogs.com/#">退出</a>
  4.     <a target="_blank" href="https://www.cnblogs.com/login.html">登录</a>
  5.     |
  6.     <a target="_blank" href="https://www.cnblogs.com/register.html">注册</a>
复制代码
2.index.js
  1. mounted(){
  2.     // 获取cookie中的用户名
  3.     this.username = getCookie('username');
  4. },
复制代码
退出登录

1. logout()方法介绍

  1. logout(request)
复制代码
2. logout()方法使用
  1. class LogoutView(View):
  2.     """退出登录"""
  3.     def get(self, request):
  4.         """实现退出登录逻辑"""
  5.         # 清理session
  6.         logout(request)
  7.         # 退出登录,重定向到登录页
  8.         response = redirect(reverse('contents:index'))
  9.         # 退出登录时清除cookie中的username
  10.         response.delete_cookie('username')
  11.         return response
复制代码
3. 知识要点

判断用户是否登录

1. 展示用户中心界面
  1. class UserInfoView(View):
  2.     """用户中心"""
  3.     def get(self, request):
  4.         """提供个人信息界面"""
  5.         return render(request, 'user_center_info.html')
复制代码
需求:
实现方案:
2. is_authenticate 判断用户是否登录

介绍:
  1. class UserInfoView(View):
  2.     """用户中心"""
  3.     def get(self, request):
  4.         """提供个人信息界面"""
  5.         if request.user.is_authenticated():
  6.             return render(request, 'user_center_info.html')
  7.         else:
  8.             return redirect(reverse('users:login'))
复制代码
3. login_required装饰器 判断用户是否登录