login.html文件
@submit.prevent #阻止默认提交
可以使用 v-cloak 指令设置样式,这些样式会在 Vue 实例编译结束时,从绑定的 HTML 元素上被移除。
当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示出 Vue 源代码。我们可以使用 v-cloak 指令来解决这一问题。
Vue中使用v-model指令来实现表单元素和数据的双向绑定。监听用户的输入,然后更新数据。
login.js文件
1.请求方式
选项 | 方案 |
---|---|
请求方法 | POST |
请求地址 | /login/ |
2.请求参数:表单
参数名 | 类型 | 是否必传 | 说明 |
---|---|---|---|
username | string | 是 | 用户名 |
password | string | 是 | 密码 |
remembered | string | 是 | 是否记住用户 |
3.响应结果:HTML
字段 | 说明 |
---|---|
登录失败 | 响应错误提示 |
登录成功 | 重定向到首页 |
# 传统登陆(校验用户名和密码)
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'^\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失效策略。
# 用户名登录的子路由:
re_path(r'^login/$', LoginView.as_view()),
- Django自带的用户认证后端默认是使用用户名实现用户认证的。
- 用户认证后端位置:django.contrib.auth.backends.ModelBackend。
- 如果想实现用户名和手机号都可以认证用户,就需要自定义用户认证后端。
- 自定义用户认证后端步骤
- 在users应用中新建utils.py文件
- 新建类,继承自ModelBackend
- 重写认证authenticate()方法
- 分别使用用户名和手机号查询用户
- 返回查询到的用户实例
在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"
]
logout()
方法django.contrib.auth.__init__.py
文件中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
# 登出
re_path(r'^logout/$', LogoutView.as_view()),