• 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'))
  • 相关阅读:
    三级联动(在YII框架中)
    用composer安装Yii
    在apache中设置访问目录后进入的默认页面为index.php
    php mb_convert_encoding的使用
    采集数据和memchche的存储使用,分页展示
    php操作Memcache
    前端页面卡顿?或是DOM操作惹的祸,需优化代码
    windows mongodb 安装
    浅谈WebSocket
    使用Spring MVC HandlerExceptionResolver处理异常
  • 原文地址:https://www.cnblogs.com/lowmanisbusy/p/9196810.html
Copyright © 2020-2023  润新知