开源web框架django知识总结
Posted 主打Python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源web框架django知识总结相关的知识,希望对你有一定的参考价值。
开源web框架django知识总结(十一)
账号登录
前端页面简介
login.html文件
@submit.prevent #阻止默认提交
可以使用 v-cloak 指令设置样式,这些样式会在 Vue 实例编译结束时,从绑定的 HTML 元素上被移除。
当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示出 Vue 源代码。我们可以使用 v-cloak 指令来解决这一问题。
Vue中使用v-model指令来实现表单元素和数据的双向绑定。监听用户的输入,然后更新数据。
- 因为input中的v-model绑定了msg,所以会实时将输入的内容传递给msg , msg发生改变。
- 当msg发生改变时,因为上面使用了插值语法将msg的值插入到DOM中,所以DOM会发生响应的改变。所以通过v-model实现了双向的绑定。
login.js文件
用户名登录
1. 用户名登录逻辑分析
2. 用户名登录接口设计
1.请求方式
选项 | 方案 |
---|---|
请求方法 | POST |
请求地址 | /login/ |
2.请求参数:表单
参数名 | 类型 | 是否必传 | 说明 |
---|---|---|---|
username | string | 是 | 用户名 |
password | string | 是 | 密码 |
remembered | string | 是 | 是否记住用户 |
3.响应结果:HTML
字段 | 说明 |
---|---|
登录失败 | 响应错误提示 |
登录成功 | 重定向到首页 |
3. 用户名登录接口定义
# 传统登陆(校验用户名和密码)
class LoginView(View):
def post(self, request):
pass
- 用户名登录后端逻辑
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'^\\w5,20$', username):
return JsonResponse('code':400, 'errmsg': '用户名格式有误', status=400)
if not re.match(r'^\\w8,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. 知识要点
- 登录的核心思想:认证和状态保持
- 通过用户的认证,确定该登录用户是阿尔法商场的注册用户。
- 通过状态保持缓存用户的唯一标识信息,用于后续是否登录的判断。
6、users.urls.py
# 用户名登录的子路由:
re_path(r'^login/$', LoginView.as_view()),
多账号登录
- Django自带的用户认证后端默认是使用用户名实现用户认证的。
- 用户认证后端位置:django.contrib.auth.backends.ModelBackend。
- 如果想实现用户名和手机号都可以认证用户,就需要自定义用户认证后端。
- 自定义用户认证后端步骤
- 在users应用中新建utils.py文件
- 新建类,继承自ModelBackend
- 重写认证authenticate()方法
- 分别使用用户名和手机号查询用户
- 返回查询到的用户实例
1. 自定义用户认证后端
在apps/users/下,新建utils.py文件
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()方法介绍
- 退出登录:
- 回顾登录:将通过认证的用户的唯一标识信息,写入到当前session会话中
- 退出登录:正好和登录相反(清理session会话信息)
- logout()方法:
- Django用户认证系统提供了
logout()
方法 - 封装了清理session的操作,帮助我们快速实现登出一个用户
- Django用户认证系统提供了
- 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. 知识要点
- 退出登录的核心思想就是清理登录时缓存的状态保持信息。
- 由于首页中用户名是从cookie中读取的。所以退出登录时,需要将cookie中用户名清除。
4、users.urls.py
# 登出
re_path(r'^logout/$', LogoutView.as_view()),
祝大家学习python顺利!
以上是关于开源web框架django知识总结的主要内容,如果未能解决你的问题,请参考以下文章