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 字符串大小写转换的简单实例
Jan 21 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
对Python中gensim库word2vec的使用详解
May 08 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
Python面向对象类继承和组合实例分析
May 28 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
python numpy 显示图像阵列的实例
Jul 02 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
Python图像识别+KNN求解数独的实现
Nov 13 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统计字符串中中英文字符的个数
2013/06/23 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
php文件操作相关类实例
2015/06/18 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
详解vue中组件参数
2018/07/09 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
Python中使用PIPE操作Linux管道
2015/02/04 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
linux系统都有哪些运行级别
2012/04/15 面试题
《猴子种果树》教学反思
2014/04/26 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
活动总结结尾怎么写
2014/08/30 职场文书
药店采购员岗位职责
2014/09/30 职场文书
公司周年庆典标语
2014/10/07 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
python中super()函数的理解与基本使用
2021/08/30 Python