开源web框架django知识总结(十一)

开源web框架django知识总结(十一)

账号登录

前端页面简介

login.html文件

@submit.prevent #阻止默认提交

可以使用 v-cloak 指令设置样式,这些样式会在 Vue 实例编译结束时,从绑定的 HTML 元素上被移除。

当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示出 Vue 源代码。我们可以使用 v-cloak 指令来解决这一问题。

Vue中使用v-model指令来实现表单元素和数据的双向绑定。监听用户的输入,然后更新数据。

  1. 因为input中的v-model绑定了msg,所以会实时将输入的内容传递给msg , msg发生改变。
  2. 当msg发生改变时,因为上面使用了插值语法将msg的值插入到DOM中,所以DOM会发生响应的改变。所以通过v-model实现了双向的绑定。

login.js文件

用户名登录

1. 用户名登录逻辑分析

开源web框架django知识总结(十一)_第1张图片

2. 用户名登录接口设计

1.请求方式

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

2.请求参数:表单

参数名 类型 是否必传 说明
username string 用户名
password string 密码
remembered string 是否记住用户

3.响应结果:HTML

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

3. 用户名登录接口定义

# 传统登陆(校验用户名和密码)
class LoginView(View):

    def post(self, request):
    	pass
  1. 用户名登录后端逻辑
import json
import re
from django.contrib.auth import login, authenticate

from django.http import JsonResponse
from django.views import View
from django_redis import get_redis_connection

from .models import User
# Create your views here.
import logging
logger = logging.getLogger('django')
# 传统登陆(校验用户名和密码)
class LoginView(View):

    def post(self, request):
        # 1、提取参数
        data = json.loads(request.body.decode())
        username = data.get('username')
        password = data.get('password')
        remembered = data.get('remembered')

        # 2、校验参数
        if not all([username, password]):
            return JsonResponse({
     'code': 400, 'errmsg': '参数缺失!'})

        if not re.match(r'^\w{5,20}$', username):
            return JsonResponse({
     'code':400, 'errmsg': '用户名格式有误'}, status=400)

        if not re.match(r'^\w{8,20}$', password):
            return JsonResponse({
     'code':400, 'errmsg': '密码格式有误'}, status=400)


        # 3、数据处理(验证用户名和密码)
        # try:
        #     user = User.objects.get(username=username)
        # except User.DoesNotExist as e:
        #     return JsonResponse({'code': 400, 'errmsg': '用户名错误!'})
        # if not user.check_password(password):
        #     return JsonResponse({'code': 400, 'errmsg': '密码错误!'})

        # authenticate():功能、参数、返回值
        # 功能:传统身份验证——验证用户名和密码
        # 参数:request请求对象,username用户名和password密码
        # 返回值:认证成功返回用户对象,否则返回None
        user = authenticate(request, username=username, password=password)
        if not user:
            return JsonResponse({
     "code": 400, 'errmsg': '您提供的身份信息无法验证!'}, status=401)

        # 状态保持
        login(request, user)

        if remembered:
            # 设置session有效期默认2周
            request.session.set_expiry(None)
        else:
            # 设置session有效期为关闭浏览器页面则失效
            request.session.set_expiry(0) # 设置为0表示关闭浏览器清楚sessionid

        # 4、构建响应
        response = JsonResponse({
     'code': 0, 'errmsg': 'ok'})

        response.set_cookie(
            'username',
            username,
            max_age=3600 * 24 * 14
        )

        return response

request.session.set_expiry(value)你可以传递四种不同的值给它:

* 如果value是个整数,session会在些秒数后失效。* 如果value是个datatime或timedelta,session就会在这个时间后失效。* 如果value是0,用户关闭浏览器session就会失效。* 如果value是None,session会依赖全局session失效策略。

5. 知识要点

  1. 登录的核心思想:认证和状态保持
    • 通过用户的认证,确定该登录用户是阿尔法商场的注册用户。
    • 通过状态保持缓存用户的唯一标识信息,用于后续是否登录的判断。

6、users.urls.py

# 用户名登录的子路由:
    re_path(r'^login/$', LoginView.as_view()),

开源web框架django知识总结(十一)_第2张图片

多账号登录

  • Django自带的用户认证后端默认是使用用户名实现用户认证的。
  • 用户认证后端位置:django.contrib.auth.backends.ModelBackend。
  • 如果想实现用户名和手机号都可以认证用户,就需要自定义用户认证后端。
  • 自定义用户认证后端步骤
    • 在users应用中新建utils.py文件
    • 新建类,继承自ModelBackend
    • 重写认证authenticate()方法
    • 分别使用用户名和手机号查询用户
    • 返回查询到的用户实例

1. 自定义用户认证后端

在apps/users/下,新建utils.py文件
开源web框架django知识总结(十一)_第3张图片
utils.py内容:

"""
自定义身份认证后端,来实现多账号登陆
"""
from django.contrib.auth.backends import ModelBackend
from .models import User

class UsernameMobileAuthBackend(ModelBackend):

    # 重写authenticate实力方法,实现多账号登陆
    # 默认ModelBackend只会根据username过滤用户
    def authenticate(self, request, username=None, password=None, **kwargs):
        # request: 请求对象
        # username: 用户名或手机号
        # password: 密码

        # 1、根据用户名过滤
        try:
            user = User.objects.get(username=username)
        except User.DoesNotExist as e:
            # 2、根据手机号过滤
            try:
                user = User.objects.get(mobile=username)
            except User.DoesNotExist as e:
                return None

        # 3、其中某一个过滤出用户,再校验密码
        if user.check_password(password):
            return user

在dev.py中新增:

# 自定义认证后端
AUTHENTICATION_BACKENDS = [
    "users.utils.UsernameMobileAuthBackend"
]

退出登录

1. logout()方法介绍

  1. 退出登录:
    • 回顾登录:将通过认证的用户的唯一标识信息,写入到当前session会话中
    • 退出登录:正好和登录相反(清理session会话信息)
  2. logout()方法:
    • Django用户认证系统提供了logout()方法
    • 封装了清理session的操作,帮助我们快速实现登出一个用户
  3. logout()位置:
    • django.contrib.auth.__init__.py文件中

2. logout()方法使用

from django.contrib.auth import login,logout,authenticate

# 登出
class LogoutView(View):

    def delete(self, request):
        # 1、获取用户对象
        # request.user是当前登陆的用户 或 是一个匿名用户
        # user是用户模型类对象 或  AnonymousUser匿名用户对象
        # user = request.user

        # 2、调用logout函数清除用户session数据
        # 通过request对象提取cookie中是sessionid,进一步删除redis中的用户数据
        logout(request)

        # 3、构建响应
        response = JsonResponse({
     'code':0, 'errmsg': 'ok'})
        response.delete_cookie('username')

        return response

3. 知识要点

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

4、users.urls.py

# 登出
re_path(r'^logout/$', LogoutView.as_view()),

开源web框架django知识总结(十一)_第4张图片

祝大家学习python顺利!

你可能感兴趣的:(python,django,ubuntu,django,vue.js,python,原力计划,后端)