django框架cookie和session用法实例详解


Posted in Python onDecember 10, 2019

本文实例讲述了django框架cookie和session用法。分享给大家供大家参考,具体如下:

首先知道http协议

http协议它是无状态的协议,验证的信息不会保留

基于请求响应,短连接

cookie

指一段小信息,内部是一组组的键值对,保存在客户端

访问一个地址时,服务器生成一个cookie,由浏览器保留在本地,再次访问地址时就会携带这个cookie,一般用于用户信息的验证

cookie的设置:

obj.set_cookie(key,value,...)

下面来看一个简单的例子

#设置cookie
def login(request):
 if request.method=="POST":
  user=request.POST.get("user")
  pwd=request.POST.get("pwd")
  user=UserInfo.objects.filter(user=user,pwd=pwd).first()
  if user:
   obj=HttpResponse("登陆成功")
   obj.set_cookie("is_login",True)
   return obj
 return render(request,"login.html")

#获取cookie并进行判断
def index(request):
 ret=request.COOKIES.get("is_login")
 if not ret:
  return redirect("/login/")
 return render(request,"index.html")

其他参数

参数:

key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
secure=False, https传输
httponly=True 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

cookie的删除

obj.delete_cookie("is_login")

下面来看一个登陆和注销页面

def books(request):
 is_login=request.COOKIES.get("is_login")
 if not is_login:
  return_url=request.path_info #判断是否有cookies没有则记录到return_url
  if return_url:
   return redirect("{}?return_url={}".format("/login/",return_url)) #将return_url加到路径后面返回到login页面,等到用户验证登陆后直接跳转到这个页面
 book_list=Book.objects.all()
 return render(request,"books.html",locals())
def login(request):
 error_msg=''
 if request.method=="POST":
  user=request.POST.get("user")
  pwd=request.POST.get("pwd")
  user_au=UserInfo.objects.filter(user=user,pwd=pwd).first() #从数据库中验证用户
  if user_au:
   return_url=request.GET.get('return_url') 
   if return_url:










#判断是否有return_url
    ret=redirect(return_url)
   else:
    ret=HttpResponse("进入其他页面")    
   ret.set_cookie("is_login",True)      #验证成功则设置cookies
   return ret
  error_msg="用户名或者密码错误"
 return render(request,"login.html",locals())

def logout(request):
 ret=redirect("/login/")
 ret.delete_cookie('is_login')
 return ret

验证第一种情况

django框架cookie和session用法实例详解 ---------------------------》》》》》django框架cookie和session用法实例详解  

#####################################################################################################################################################################################

验证第二种情况

django框架cookie和session用法实例详解----------》》》》》django框架cookie和session用法实例详解------》》》django框架cookie和session用法实例详解

session

由于cookies保存在客户端上面,存在不安全因素,并且有长度限制---4096

进而引入了session

session的用法

# 获取、设置、删除Session中数据
request.session['k1'] #获取
request.session.get('k1',None) #获取
request.session['k1'] = 123 #设置
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']

# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 会话session的key
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")
# 删除当前会话的所有Session数据
request.session.delete() #删除reponse sessionid,用户已经访问不了了,但是可以看到 request sessionid
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush() # reponse 和 request sessionid都看不到
 这用于确保前面的会话数据不可以再次被用户的浏览器访问
 例如,django.contrib.auth.logout() 函数中就会调用它。
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
 * 如果value是个整数,session会在些秒数后失效。
 * 如果value是个datatime或timedelta,session就会在这个时间后失效。
 * 如果value是0,用户关闭浏览器session就会失效。
 * 如果value是None,session会依赖全局session失效策略。

下面来看一个例子

def books(request):
 # is_login=request.COOKIES.get("is_login")
 is_login=request.session.get("is_login")
 if not is_login:
  return_url=request.path_info
  if return_url:
   return redirect("{}?return_url={}".format("/login/",return_url))
 book_list=Book.objects.all()
 return render(request,"books.html",locals())
def login(request):
 error_msg=''
 if request.method=="POST":
  user=request.POST.get("user")
  pwd=request.POST.get("pwd")
  user_au=UserInfo.objects.filter(user=user,pwd=pwd).first()
  if user_au:
   return_url=request.GET.get('return_url')
   if return_url:
    ret=redirect(return_url)
   else:
    ret=HttpResponse("进入其他页面")
   # ret.set_cookie("is_login",True)
   request.session['is_login']=True
   return ret
  error_msg="用户名或者密码错误"
 return render(request,"login.html",locals())
def logout(request):
 ret=redirect("/login/")
 # ret.delete_cookie('is_login')
 request.session.delete() #删除Reponse sessionID
 # request.session.flush() #删除Reponse sessionID和Request sessionID
 return ret

设置了session之后,数据库会自动生成一个表,表名:django_session

django框架cookie和session用法实例详解

我们来查看session的默认设置

from django.conf import settings,global_settings
通过 global_settings查看到下面信息
############
# SESSIONS #
############

# Cache to store session data if using the cache session backend.
SESSION_CACHE_ALIAS = 'default'
# Cookie name. This can be whatever you want.
SESSION_COOKIE_NAME = 'sessionid'
# Age of cookie, in seconds (default: 2 weeks).
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
# A string like ".example.com", or None for standard domain cookie.
SESSION_COOKIE_DOMAIN = None
# Whether the session cookie should be secure (https:// only).
SESSION_COOKIE_SECURE = False
# The path of the session cookie.
SESSION_COOKIE_PATH = '/'
# Whether to use the non-RFC standard httpOnly flag (IE, FF3+, others)
SESSION_COOKIE_HTTPONLY = True
# Whether to save the session data on every request.
SESSION_SAVE_EVERY_REQUEST = False
# Whether a user's session cookie expires when the Web browser is closed.
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# The module to store session data
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# Directory to store session files if using the file session module. If None,
# the backend will use a sensible default.
SESSION_FILE_PATH = None
# class to serialize session data
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

1. 数据库Session

SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)

2. 缓存Session

SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default'       # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3. 文件Session

SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None         # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()

4. 缓存+数据库

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'  # 引擎

5. 加密Cookie Session

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎

其他公用设置项:

SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
python实现list元素按关键字相加减的方法示例
Jun 09 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
python实战教程之自动扫雷
Jul 13 Python
python3基于TCP实现CS架构文件传输
Jul 28 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Python 简单计算要求形状面积的实例
Jan 18 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
python中常见错误及解决方法
Jun 21 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 Python
Python中可变和不可变对象的深入讲解
Aug 02 Python
python selenium实现发送带附件的邮件代码实例
Dec 10 #Python
opencv设置采集视频分辨率方式
Dec 10 #Python
django框架forms组件用法实例详解
Dec 10 #Python
django框架auth模块用法实例详解
Dec 10 #Python
django框架中间件原理与用法详解
Dec 10 #Python
Django2 连接MySQL及model测试实例分析
Dec 10 #Python
python实现将视频按帧读取到自定义目录
Dec 10 #Python
You might like
PHP session有效期问题
2009/04/26 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
php中namespace use用法实例分析
2016/01/22 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
php经典趣味算法实例代码
2020/01/21 PHP
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
jquery拖动插件(jquery.drag)使用介绍
2013/06/18 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
微信小程序云开发详细教程
2019/05/16 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
使用Python解析JSON数据的基本方法
2015/10/15 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
椰子猫砂:CatSpot
2018/08/27 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
Linux机考试题
2015/10/16 面试题
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
初一英语教学反思
2016/02/15 职场文书
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python