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'))
django项目 设置session 实现用户登入登出的更多相关文章
- 潭州课堂25班:Ph201805201 django 项目 第十七课 用户登录,登出实现 (课堂笔记)
登录,校验: 1,判断用户名输入是否为空, 2,判断用户名密码是否匹配, 3,记住我的功能,:将用户信息记到 session 中 请求方式: POST 在视图中: # 1,创建类# 2,获取前台参数# ...
- SpringBoot整合SpringSecurity简单实现登入登出从零搭建
技术栈 : SpringBoot + SpringSecurity + jpa + freemark ,完整项目地址 : https://github.com/EalenXie/spring-secu ...
- [Django]登陆界面以及用户登入登出权限
前言:简单的登陆界面展现,以及用户登陆登出,最后用户权限的问题 正文: 首先需要在settings.py设置ROOT_URLCONF,默认值为: ROOT_URLCONF = 'www.urls'# ...
- 利用redis,为Django项目储存session
1.准备工作 pip install redis pip install django-redis-sessions==0.5.6 (推荐使用此版本) 创建一个django项目,新建一个booktes ...
- 潭州课堂25班:Ph201805201 django 项目 第七课 用户模型设计 (课堂笔记
在 user 的应用中的 models.py: 导入 dango 自带的用户模型 from django.contrib.auth.models import AbstractUser,UserMan ...
- Django项目: 项目环境搭建 ---- 二、django项目设置
1.配置模板文件 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.p ...
- django项目设置
1 项目下的文件 用于项目设定的setting.py 用于url规则匹配的urls.py 用于创建socket对象的wsgi.py 2 urls django2.0相比1.x,在url匹配语法上有很大 ...
- django时区设置以及全球用户如何各自显示当地时间
在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONE和USE_TZ 如果USE_TZ设置为True时,Django会使用系统默认设置的时区,即 ...
- Django项目实战 - html中用户登录判断
实现逻辑: {% if request.user.is_authenticated %} 个人信息{% else %}登录{% endif %} 直接上代码 {% if request.user.is ...
随机推荐
- bootstrap下modal模态框中webuploader控件按钮异常(无法点击)问题解决办法【转】
http://bbs.csdn.net/topics/391917552 具体如下: $(function () { var _$modal = $('#MyModal'); ...
- 判断浏览器是ie9座特殊处理
function ie(){ var agent = navigator.userAgent.toLowerCase();//判断浏览器版本 return (!!window.ActiveXObjec ...
- UI小白如何快速提升自己
作为一名经历过UI学习的过来人,这些观点是自己在整个学习的过程中总结的. 希望可以对大家有所帮助,可以让刚开始接触UI的人少走弯路吧,话不多说. 快速进入主题. 那么UI小白到底如何快速提成自己呢 ...
- 20155206 2016-2017-2 《Java程序设计》第9周学习总结
20155206 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...
- METAGENOMIC SEQUENCING ANALYSIS WORKFLOW
Metagenomics is defined as the study of the metagenome, which is total genomic DNA from environmenta ...
- python读取文件,python读取的1变成\ufeff1
'\ufeff1' movies={} fm=open(self.path+'/movie.txt',encoding='utf-8') w2=open('./data/1.txt','a') for ...
- java @option之args4j
args4j简介 args4j是一个用来配置命令行的工具. 在实际的项目中用到命令行的并不是很常见,但当真正使用到时,特别是在程序启动时配置一下参数的时候就很有用了,如果参数很多的话,一个一个解析命令 ...
- python 求最大子序列
动态规划的本质,是对问题状态的定义和状态转移方程的定义.dynamic programming is a method for solving a complex problem by breaki ...
- "请求被中止: 未能创建 SSL/TLS 安全通道"解决办法
1.安装证书: 手动双击证书安装,过程略 2.分配权限: 在控制台中找到安装的证书,右键选择“管理私钥”, 添加自己需要的权限,如果在测试可以直接添加Everyone 3.修改代码:public st ...
- SwapBuffers的等待,虚伪的FPS(转)
FPS在实时渲染中扮演着一个重要的角色,也许你会去笑一个不懂FPS是什么的游戏新手,但也许,这只是五十步笑一百步罢了.你能读懂SwapBuffers的深情等待吗?——ZwqXin.com frames ...