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 ...
随机推荐
- 解决ios手机页面overflow scroll滑动很卡的问题
在移动端html中经常出现横向/纵向滚动的效果,但是在iPhone中滚动速度很慢,感觉不流畅,有种卡卡的感觉,但是在安卓设备上没有这种感觉; 要解决这个问题很简单: 一行代码搞定 -webkit-ov ...
- 子类覆写的变量被private隐藏,强制转换方式通过子类访问父类的被覆写变量:
import static java.lang.System.*; public class SuperParent{ public static void main(String[] args){ ...
- DB2通用数据库性能调整的常用方法
DB2通用数据库性能调整的常用方法 DB2通用数据库性能调整的常用方法 Agenda 统计值更新--runstats 调整Buffer pool 调整日志缓冲区大小 应用程序堆大小 排序堆大小 ...
- window server2012服务器上如何安装nginx并启动
window环境下,Nginx安装启动的步骤如下: 把下载的window下的安装包,解压到一个不包含空格的路径下,比如:d:/Nginx 打开命令行窗口[win+R 输入cmd,然后确定]. 进入解压 ...
- 2018.08.28 集合堆栈机(模拟+STL)
描述 中学数学里集合的元素往往是具体的数字,比如A = {1,2,3},B = {}(空集)等等.但是要特别注意,集合的元素也可以是另一个集合,比如说C = {{}},即说明C有且仅有一个元素--空集 ...
- RHEL6解决无法使用YUM源问题(转)
RHEL的YUM源需要注册用户才能更新使用,由于CentOS和RHEL基本没有区别,并且CentOS已经被REHL收购.所以将RHEL的YUM源替换为CentOS即可.问题如下:[root@bogon ...
- 全国各地dns服务器列表
211.103.13.101 江苏省无锡市 移动DNS服务器 211.136.28.231 北京市 移动DNS服务器 211.136.28.234 北京市 移动DNS服务器 211.136.28.23 ...
- CodeForces 611C New Year and Domino (动态规划,DP)
题意:给定一个h*w的网格,里面只有.和#,.表示空的,#表示禁止的,然后有q个询问,询问中给你两个坐标,分别是左上和右下,求在这两者中间的有多少种(竖着和横着)两个相邻的点. 析:一看到这个题目,肯 ...
- cmake-mark_as_advanced
mark_as_advanced: Mark cmake cached variables as advanced. mark_as_advanced([CLEAR|FORCE] VAR VAR2 V ...
- IP之NCO仿真
NCO仿真要用.vo仿真模型,不能用.v文件 /**************************************************************************** ...