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用户认证

未完待续....

原文地址:https://www.cnblogs.com/17vv/p/11574785.html