二、auth组件


返回
  • 保存在浏览器上的键值对
  • 可以主动清除
  • 可以被伪造
  • 跨域名cookie不共享
# 服务端设置cookie
ret = redirect("...")
ret.set_cookie('key','value',max_age=10,path='/',)
ret.set_signed_cookie('key','value',salt='加密盐',...)
# 获取cookie
request.COOKIES.get('key')
ret.get_signed_cookie('key')
# 删除cookie
ret.delete_cookie(...)

# 客户端浏览器设置cookie
<script src="jquery.cookie.js"></script>
$.cookie('key','value',{'path':'/'})

2.2 session

  • 客户端cookiesessionid = session_key(随机字符串)
  • 键值对保存在django-session表中:session_key, session_data, expire_date
# 设置session
request.session['usr'] = 'admin'
request.session['pwd'] = '123456'
# 获取session
usr_name = request.session['usr']
usr_name = request.session.get('pwd',defalut=None)
# 删除session
del request.session['usr']
# 删除当前的会话数据并删除会话的Cookie
request.session.flush()  
  • setting.py配置
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key
SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False  # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认修改之后才保存(默认)

2.3 调用auth模块

# 原生auth用户表
from django.contrib import auth
from django.contrib.auth.models import User
# 自定义auth用户表
from django.contrib.auth.models import AbstractUser  
class UserInfo(AbstractUser):
    """
    用户信息表(自定义的auth组件):
    用户名|密码|电话|创建时间|头像文件
    """
    telephone = models.CharField(max_length=11, null=True, unique=True)
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='用户创建时间')
    avatar = models.FileField(upload_to='avatars/', default='avatars/default.png')

2.2 注册

# 方法一:终端指令
python3 manage.py createsuperuser
# 方法二:对象实例化(常用)
User.objects.create_user(username=usr, password=pwd)

2.3 登录

# 与数据库账户、密码校验,验证成功返回obj对象,失败返回None
obj = auth.authenticate(username=usr, password=pwd)
if obj:
  	# 登录成功,使用django的session框架给该用户附加上session id等信息
    auth.login(request, obj)  

2.4 注销

# 当前请求的session信息会全部清除,源码调用request.session.flush()
auth.logout(request)

2.5 判断是否登录状态

# 未登录
if request.user.uesrname:  # 用户名,未登录为空
if request.user.id:  # None
if request.user.is_anonymous:  # True,匿名用户
if request.user.is_authenticated  # false

2.6 修改密码

use r = User.objects.get(username='')
# 校验旧密码
user.check_password(pwd)
# 设置新密码
user.set_password(password='')
user.save

2.7 装饰器

  • 视图函数

    from django.contrib.auth.decorators import login_required
    # 若用户没有登录,则会跳转到django默认的登录URL "/accounts/login/"
    @login_required
    def my_view(request):
      ...
    
  • settings.py文件设置LOGIN_URL

    LOGIN_URL = "/login/"
    

2.8 全局变量request.user

from django.contrib.auth.models import AnonymousUser
# 未登录
request.user == AnonymousUser  # 匿名对象
# 登录
request.user == obj  # 登录对象
返回