Django用户认证
一、Cookie保存登陆状态
Cookie说明:
Cookie是一段小信息(数据格式一般是类似key-value的键值对),由服务器生成,并发送给浏览器让浏览器保存(保存时间由服务端定夺)。当浏览器下次访问该服务端时,会将它保存的Cookie再发给服务器,从而让服务器根据Cookie知道是哪个浏览器或用户在访问它。(由于浏览器遵从的协议,它不会把该服务器的Cookie发送给另一个不用host的服务器)。
Django中实现Cookie
from django.shortcuts import render, redirect
# 设置cookie
"""
key: cookie的名字
value: cookie对应的值
max_age: cookie过期的时间
"""
# 保存cookie到浏览器
response = redirect('/index/')
response.set_cookie(key, value, max_age)
# 为了安全,可以调用下面的函数来给cookie加盐
response.set_signed_cookie(key, value, salt='加密盐', max_age)
# 获取cookie
def index(request):
request.COOKIES.get(key)
request.get_signed_cookie(key, salt='加密盐', default=None)
# 删除cookie
response = redirect('/index/')
response.delete_cookie(key)
具体代码
# view.py
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
"""
验证用户名密码逻辑...
"""
# 如果密码正确
if pwd == user_obj[0].u_pwd:
# 设置cookie
response = redirect('/index/')
response.set_signed_cookie('username', username, salt='加密盐', max_age=3600*240)
return response
def index(request):
# 获取cookie
username = request.get_signed_cookie('username', salt='加密盐', default=None)
"""
主页页面展示逻辑...
"""
# 将username传到前端判断是否为None验证用户是否已登陆
def logout(request):
# 清除cookie
response = redirect('/index/')
response.delete_cookie('username')
return response
二、使用DJango的auth模块
1、models.py中创建用户表继承AbstractUser
# models.py
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):
"""
AbstractUser提供基本的用户字段
注意:AbstractUser中的密码使用密文存储
添加自定义字段
"""
2、setting中配置
# setting.py
AUTH_USER_MODEL = 'appname.MyUser'
3、使用auth模块进行登陆认证
from django.contrib import auth
def login(request):
"""
登陆逻辑...
"""
# 验证用户账号密码,登陆成功返回用户对象,失败返回None
user = auth.authenticate(username=username, password=pwd)
if user:
# 将用户登陆状态记录到request中
auth.login(reqeust, user)
4、前端判断用户是否已登陆
# home.html
{% if request.user.is_authenticated %}
<li><a href="#">{{ request.user.username }}</a></li>
{% else %}
<li><a href="/login/" style="color:black;">登陆</a></li>
{% endif %}
三、自定义auth用户认证
未完待续....