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下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
python中__slots__用法实例
Jun 04 Python
python如何在终端里面显示一张图片
Aug 17 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
Python3中bytes类型转换为str类型
Sep 27 Python
python三引号输出方法
Feb 27 Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 Python
Python3自定义json逐层解析器代码
May 11 Python
python代码能做成软件吗
Jul 24 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
浅谈Python项目的服务器部署
Apr 25 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 24 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
通过文字传递创建的图形按钮
2006/10/09 PHP
第四章 php数学运算
2011/12/30 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python实现人人网登录示例分享
2014/01/19 Python
python使用pymysql实现操作mysql
2016/09/13 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
百度JavaScript笔试题
2015/01/15 面试题
安全生产责任书
2014/03/12 职场文书
中国入世承诺
2014/04/01 职场文书
美化环境标语
2014/06/20 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
Javascript中的解构赋值语法详解
2021/04/02 Javascript
详解nodejs内置模块
2021/05/06 NodeJs
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript