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删除特定文件的方法
Jul 30 Python
Python类属性的延迟计算
Oct 22 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
python2.7实现复制大量文件及文件夹资料
Aug 31 Python
Python转换itertools.chain对象为数组的方法
Feb 07 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
python 多线程死锁问题的解决方案
Aug 25 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
python 操作excel表格的方法
Dec 05 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
php下使用无限生命期Session的方法
2007/03/16 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
js匿名函数使用&传参(实例)
2017/09/08 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
Django中的Model操作表的实现
2018/07/24 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
Python如何输出百分比
2020/07/31 Python
python 将html转换为pdf的几种方法
2020/12/29 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
运动会致辞稿50字
2014/02/04 职场文书
学校开除通知书
2015/04/25 职场文书
2015年新教师工作总结
2015/04/28 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python