django项目 设置session 实现用户登入登出

一.配置文件 settngs.py中

# 使用django认知系统的登录状态装饰器时,没有登录的话,跳往登录页面后路径是/acount/login 需要重新指定
LOGIN_URL = '/user/login'

# 设置允许保存session
SESSION_SAVE_EVERY_REQUEST = True
# 设置session存放在缓存中
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# 使用默认选项的缓存设置存放session
SESSION_CACHE_ALIAS = "default"
# 设置session过期时间,关闭浏览器时session过期(cookies) 和设置固定时间后过期 只能二选一
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
# 30分钟后session过期, 只能和关闭时浏览器失效 二选一
# SESSION_COOKIE_AGE=5*60

二.创建一个base_model.py

from django.db import models


# 创建所有的模型的基类
class BaseModel(models.Model):
    """抽象模型基类"""
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now_add=True, verbose_name='更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')

    class Meta:
        # 指定这个类是一个抽象模型类
        abstract = True

三.用户模型models.py中

from django.db import models

# 导入django默认的认证系统包,使用认证系统自带的模型创建用户相关字段
from django.contrib.auth.models import AbstractUser   # 该包下有个模块的名字和这个很相似becareful
# 导入抽象模型基类
from db.base_model import BaseModel


# 使用django默认的认证系统的类去创建模型
class User(AbstractUser, BaseModel):
    """用户模型类"""
    # 指定数据表的名字,以及后台管理系统显示字段的名字
    class Meta:
        # 指定数据表的名字
        db_table = 'df_user'
        # 指定后台管理系统显示字段的名字
        verbose_name = '用户'
        # 让设置的后台管理系统的名字和设置的一致
        verbose_name_plural = verbose_name

四.视图文件views.py中

from django.shortcuts import render, redirect  # 返回应答,反解析
from django.core.urlresolvers import reverse  # 用来进行反解析操作
from django.core.mail import send_mail  # 使用这个模块进行发送邮件操作
from django.http import HttpResponse
from django.views.generic import View  # 导入通用类视图 后面的View v大写
from django.conf import settings
from django.contrib.auth import authenticate, login, logout  # 通过导入django认证系统的这三个模块,进行用户身份确认,登录,登出操作
from django.core.paginator import Paginator

# 导入正则
import re
# 因为在setting.py 中导入的默认搜寻路径,所以虽然报错,但是可以导入. 如果修改,无法访问,为什么.
from user.models import User, Address
from goods.models import GoodsSKU
from order.models import OrderInfo,OrderGoods
# 导入itsdangerous包里的方法,进行数据签名
from itsdangerous import TimedJSONWebSignatureSerializer as make_sign
# 用来捕捉激活连接的签名是否过期
from itsdangerous import SignatureExpired
# 导入发送激活邮件的模块celery
from celery_tasks.tasks import send_register_active_email
# 导入redis相关模块,和redis数据库进行交互
from redis import StrictRedis
# 导入自定的装饰器类
from utils.mixin import LoginRequiredView, LoginRequiredViewMixin


# django框架会给request对象增加一个属性user
# 如果用户已经登录,user是认证系统用户模型类(User)的实例对象
# 如果用户没有登录,user是AnonymousUser类的实例对象
# 在模板文件中可以直接使用request的user属性
class LoginView(View):
    """登录"""
    def get(self, request):
        """显示登录页面"""
        # 获取在请求过程中传递回来的cookie
        if 'username' in request.COOKIES:
            username = request.COOKIES['username']
            # 如果用户在请求登录页面时发送了带有username的cookie,说明用户选择记住了用户名,应该将相应的html标签改为checked
            checked = 'checked'
        else:
            # 没有发送用户名过来,将两个空字符串传递回去
            username = ''
            checked = ''
        return render(request, 'login.html', {'username':username, 'checked': checked})

    def post(self, request):
        """提交登录信息"""
        # 获取参数
        username = request.POST.get('username')
        password = request.POST.get('pwd')
        remember = request.POST.get('remember')
        # 参数校验
        if not all([username, password]):
            return render(request, 'login.html', {'errmsg': '请填写用户名和密码'})
        # 业务处理
        # 根据用户名和密码查找用户信息,使用django认证系统的authenticate(username=username, password=password)
        # 方法,判断用户是否存在
        user = authenticate(username=username, password=password)
        # 进行判断
        if user is not None:
            # 进行判断账户是否已经激活
            if user.is_active:
                # 用户已激活, 允许登录,使用login()方法,记录登录状态,这是django自带的认证系统的一个方法,会自己创建session,参数必须传入
                # 如果自己自己创建session   request.session[键]=值,  request.session.set_expiry(value)
                # 如果value是一个整数,会话将在value秒没有活动后过期。
                # 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。
                # 如果value为None,那么会话永不过期。
                # 如果没有指定过期时间则两个星期后过期。
                login(request, user)
                # 获取登录后要跳转到的next地址, 默认跳转到首页 /user/login?next=参数
                next_url = request.GET.get('next', reverse('goods:index'))
                # print(next_url)
                # 跳转到next_url网址
                # redirect()是HttpResponseRedirect的方法, HttpResponseRedirect是HttpResponse的子类, 最终返回的是一个response对象
                # 在提交表单的模板html form表单中,不设置action,就会使用地址栏的地址进行提交,这样才能将参数传递过来
                response = redirect(next_url)
                # 判断是否需要记住用户名
                if remember=="on":
                    # 设置一个cookie信息,来保存用户的用户名
                    # 设置cookie需要调用set_cookie方式,set_cookie它是HttpResponse对象的方法
                    # HttpResponseRedirect是HttpResponse的子类
                    response.set_cookie('username', username, max_age=7*24*3600)
                else:
                    # 否则删除cookie,取消记住用户名
                    response.delete_cookie('username')
                # 返回应答
                return response
            else:
                # 用户未激活
                return render(request, 'login.html', {'errmsg':'用户名未激活,请先激活'})
        else:
            # 用户名或密码错误
            return render(request, 'login.html', {'errmsg': "用户名与密码不匹配"})


# 登出账号 /user/logout
class LogoutView(View):
    """退出登录"""
    def get(self, request):
        # django自带的认证系统功能,能登出账号
        logout(request)
        # 返回应答,转到首页
        return redirect(reverse('goods:index'))

猜你喜欢

转载自www.cnblogs.com/lowmanisbusy/p/9196810.html