一.配置文件 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. mvcpager 表单提交时无法获取pageindex的值

    1.将分布页包含到form中 2.在分布页中新增一个表单hidden元素,name为pageIndex(与控制器中的pageindex保持一尺),将后台获取到的pageindex值通过viewbag初 ...

  2. BZOJ1222 [HNOI2001]产品加工 - 动态规划- 背包

    题解 怎么看都不像是个背包,直到我看了题解→_→, 第一次碰到这么奇怪的背包= = 定一个滚动数组$F_i$, $i$表示机器$a$用了$i$的时间, $F_i$表示机器$b$用了$F_i$的时间, ...

  3. [BAT]操作系统定时任务调用批处理忽略error继续运行的方法

    如下,通过forfiles删除7天以前生成的一些文件,当不存在满足搜索条件的文件时,就会报错:ERROR: No files found with the specified search crite ...

  4. swift 设置string 中汉字中变色等处理代码

    我们在做弹窗 或者显示label string的时候经常会用到字体变色 变大 等特殊处理, swift中提供一个函数 NSMutableAttributedString 使用方法简介 var main ...

  5. 日期处理相关 - “Fri Dec 11 00:00:00 CST 2015”日期格式解析

    1.后台处理方式: /* 精简版解析 - 推荐 */ String a= "Fri Dec 11 00:00:00 CST 2015"; Date d = new Date(a); ...

  6. foreach循环赋值问题

    foreach ($list as $key=>$val){ $data=array();//这一个一定要加上不然循环后,modify_one,modify_two都会赋值 if ($val[' ...

  7. hdu-1176(动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176 思路:类似数塔问题, 从最后一秒开始考虑,每次这一秒的状态确定意味着前一秒的状态也已经确定,所以 ...

  8. arduino uno r3 + SIM900 + USB打火机 实现电话触发点火

    需求来源 1.儿子过完年6岁,喜欢玩烟花,但是胆子小,于是我就负责点火,从年前26到大年初八,每天晚上要给儿子点鞭炮啊点鞭炮. 2.这边过年要打关门炮跟开门炮,大年初一凌晨还要起来帮老妈点鞭炮,说实在 ...

  9. C++ 动态分配 和 内存分配和内存释放

    动态分配 动态分配可以说是指针的关键所在.不需要通过定义变量,就可以将指针指向分配的内存.也许这个概念看起来比较模糊,但是确实比较简单.下面的代码示范如何为一个整数分配内存: int *pNumber ...

  10. ansible api 调用出现ssh交互式输入

    发现在删掉 ~/.ssh/know_hosts 之后运行 ansible api 会出现以下提示 The authenticity of host '10.1.*.* (10.1.*.*)' can' ...