一.配置文件 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'))

django项目 设置session 实现用户登入登出的更多相关文章

  1. 潭州课堂25班:Ph201805201 django 项目 第十七课 用户登录,登出实现 (课堂笔记)

    登录,校验: 1,判断用户名输入是否为空, 2,判断用户名密码是否匹配, 3,记住我的功能,:将用户信息记到 session 中 请求方式: POST 在视图中: # 1,创建类# 2,获取前台参数# ...

  2. SpringBoot整合SpringSecurity简单实现登入登出从零搭建

    技术栈 : SpringBoot + SpringSecurity + jpa + freemark ,完整项目地址 : https://github.com/EalenXie/spring-secu ...

  3. [Django]登陆界面以及用户登入登出权限

    前言:简单的登陆界面展现,以及用户登陆登出,最后用户权限的问题 正文: 首先需要在settings.py设置ROOT_URLCONF,默认值为: ROOT_URLCONF  = 'www.urls'# ...

  4. 利用redis,为Django项目储存session

    1.准备工作 pip install redis pip install django-redis-sessions==0.5.6 (推荐使用此版本) 创建一个django项目,新建一个booktes ...

  5. 潭州课堂25班:Ph201805201 django 项目 第七课 用户模型设计 (课堂笔记

    在 user 的应用中的 models.py: 导入 dango 自带的用户模型 from django.contrib.auth.models import AbstractUser,UserMan ...

  6. Django项目: 项目环境搭建 ---- 二、django项目设置

    1.配置模板文件 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.p ...

  7. django项目设置

    1 项目下的文件 用于项目设定的setting.py 用于url规则匹配的urls.py 用于创建socket对象的wsgi.py 2 urls django2.0相比1.x,在url匹配语法上有很大 ...

  8. django时区设置以及全球用户如何各自显示当地时间

    在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONE和USE_TZ 如果USE_TZ设置为True时,Django会使用系统默认设置的时区,即 ...

  9. Django项目实战 - html中用户登录判断

    实现逻辑: {% if request.user.is_authenticated %} 个人信息{% else %}登录{% endif %} 直接上代码 {% if request.user.is ...

随机推荐

  1. 移动端input验证只允许有数字 在safari浏览器一直不成功解决

    <input class="lineHeight-30" type="text" onkeyup="value=value.replace(/[ ...

  2. PAT 1083 是否存在相等的差(20)(代码+思路)

    1083 是否存在相等的差(20 分) 给定 N 张卡片,正面分别写上 1.2.--.N,然后全部翻面,洗牌,在背面分别写上 1.2.--.N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差 ...

  3. 用Vue-cli生成vue+webpack的项目模板怎么设置为vue1.0版本?

    用Vue-cli生成vue+webpack的项目模板 $ npm install -g vue-cli $ vue init webpack my-project $ cd my-project $ ...

  4. 【Sikuli】Sikuli 文档

    http://sikulix-2014.readthedocs.io/en/latest/index.html

  5. [BAT]远程执行或停止计划任务

    执行 schtasks /run /tn "IPADForAdvisor_QA_APITest" /s SZPCWIN2K801 /u msdomain1\jzhang6 /p j ...

  6. CocoStudio

    不知道从哪里下载的CocoStudio_Full_V1.0.0.1.1185392965.exe 安装后点击"Animation Editor"."UI Editor&q ...

  7. msys2 命令行添加镜像地址

    sed -i "1iServer = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686" /etc/pacman.d/mi ...

  8. [原创] 分享一下Sencha 三种环境(开发环境、测试环境、生产环境)的优雅配置方案

    背景介绍: 在一个AspNet MVC Web API的后端Web开发项目中,使用了Sencha6.5+作为前端表现技术. 在进行两种开发框架的物理文件整合的时候,笔者不想把他俩的物理文件都“揉”在一 ...

  9. 2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)

    传送门 不得不说这题有点东西啊. 看到题第一眼二分,用二次函数求范围来进行checkcheckcheck,20分滚粗了233. 于是开始思考正解. 发现可以把每只怪物的二元组属性看成二维坐标. 这时对 ...

  10. 2018.10.15 NOIP训练 百事世界杯之旅(期望dp)

    传送门 期望题. 其实跟dpdpdp关系并不大. 考虑f[i]f[i]f[i]表示已经凑出了iii个需要的次数. 显然有:f[i]=ni∗f[i]+nn−i∗f[i+1]+1f[i]=\frac {n ...