Django学习系列之Cookie、Session
Cookie和Session介绍
cookie
保存在客户端
session
- 保存在服务端
- session依赖于cookie,比如服务端想往客户端写东西的时候就把cookie写到客户端浏览器
django自带的session库有以下几点选择
- a)database-backed session 存数据库
- b)cached sessions 存缓存
- c)use file-based sessions 存文件
- d)cookie-based sessions 存cookie
Cookie
cookies是浏览器为Web服务器存储的一小段信息,每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies.
存取cookies
创建cookie
def cookie(request):
obj = render(request,'cookie.html')
obj.set_cookie("k1","v1") #设置cookie
return obj
#注释:给客户端返回页面的时候顺便设置cookie
获取cookie
def cookie(request):
print(request.COOKIES) #获取所有的cookie
print(request.COOKIES['k2']) #获取key为k2的cookie
obj = render(request,'cookie.html')
obj.set_cookie("k1","v1",path='/cookie')
return obj
创建cookie时的参数
| 参数 | 默认值 | 描述 |
| max_age | None | cookie生存时间,如果参数是None,这个cookie会延续到浏览器关闭为止 |
| expires | None | cookie失效的实际日期/时间,格式必须是:Wdy, DD-Mth-YY HH:MM:SS GMT,这个参数会覆盖max_age参数 |
| path | "/" | cookie对哪个url生效,比如说设置为/login,那么/index页面就看不到cookie |
| domain | None | 这个cookie在那个站点生效,如果为None,就是当前站点,如果设为domain=".example.com",则所有带example.com的二级域名站点都可读到cookie |
| False | False | 如果设置为True,浏览器将通过HTTPS来回传cookie |
Session
示例1:客户端第一次访问index,需要登陆才能访问,第二次就可以直接访问index
进行数据库同步
python3.5 manage.py makemigrations
python3.5 manage.py migrate
#因为django默认会把session信息存放在数据库的django_session表
创建视图
from django.shortcuts import render,HttpResponse,redirect
USER_LIST = {"user1","user2"}
#登陆函数
def session_login(request):
if request.method == "POST":
u = request.POST.get("user")
p = request.POST.get("pwd")
if p == "" and u in USER_LIST: #如果验证通过
request.session["user"] = u #设置session,
return redirect("/session_index") #跳转到index页面
else:
return render(request,"session_login.html") #如果验证不通过,继续在登陆页面
def auth(func): #这个装饰器的作用就是帮所有需要登陆后才能访问的页面自动验证是否登陆(原理:查看客户端访问页面的时候是否带session_id,)
def inner(request,*args,**kwargs):
user = request.session.get("user") #是否有session信息
if not user: #如果没有
return redirect("/session_login")
return func(request,*args,**kwargs) #如果有就执行被装饰的函数
return inner #主页信息,需要登陆后才能看
@auth
def session_index(request):
return render(request,"session_index.html")
#退出登陆函数
def session_logout(request):
del request.session["user"] #删除session信息
return redirect("/session_login") #然后跳转到login页面
创建路由信息
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^session_login/', views.session_login),
url(r'^session_index/', views.session_index),
url(r'^session_logout/', views.session_logout),
]
创建模板
session_login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/session_login/" method="POST">
<input type="text" name="user"/>
<input type="text" name="pwd"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
session_index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎登陆</h1>
<a href="/session_logout">注销</a>
</body>
</html>
测试第一次访问是否需要登陆才能访问index页面,第二次访问不用登陆,直接就能访问index页面

在客户端查看session信息

在服务端查看session信息

第一段是session_id,第二段加密了的登陆用户名,user1
session是登陆的用户名和session_id保存在服务端中,而客户端只保存一个session_id,django通过读取客户端带的session_id来查找对应的用户名,并返回客户端
流程
- 第一次客户端登陆的时候,如果登陆成功,服务端生成一个session_id和登陆的用户名,并保存在数据库的django_session表中,然后跳转到index页面
- 然后把session_id写入客户端的浏览器中
- 第二次客户端访问会带着session_id访问,服务端检测是否存在,如果存在就直接能访问index
session方法
def index(request):
# 获取、设置、删除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的随机字符串
request.session.session_key # 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key") # 删除当前用户的所有Session数据
request.session.delete("session_key") request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
session存储选择
存储在数据库
settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
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,默认修改之后才保存(默认)
存出在本地目录
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
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学习系列之Cookie、Session的更多相关文章
- Django学习系列之Form基础
Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法
django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...
- Django学习笔记之Cookie、Session和自定义分页
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- Django学习系列6:使用selenium测试用户交互
学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...
- node学习笔记9——cookie,session相关操作
下面讲的都是基Express及相关的包.所以在实践本篇文章之前,通过npm安装好Express, cookie-parser, cookie-session这三个安装包. 先简单说一下,如何用Expr ...
- Python Web学习笔记之Cookie,Session,Token区别
一.Cookie,Session,Token简介 # 这三者都解决了HTTP协议无状态的问题 session ID or session token is a piece of data that i ...
- django学习系列——python和php对比
python 和 php 我都是使用过,这里不想做一个非常理性的分析,只是根据自己的经验谈一下感想. 在web开发方面,无疑 php 更甚一筹. 从某种角度来说,php 就是专门为 web 定制的语言 ...
- Javaweb学习笔记5—Cookie&Session
今天来讲javaweb的第五阶段学习. Cookie和Session同样是web开发常用到的地方. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的 ...
- Django学习系列之request对象
先来一个简单的实例 urls.py from django.conf.urls import url from django.contrib import admin from cmdb import ...
随机推荐
- Net作业调度
Net作业调度(一) -Quartz.Net入门 2014-11-01 13:14 by 蘑菇先生, 13954 阅读, 7 评论, 收藏, 编辑 背景 很多时候,项目需要在不同时刻,执行一个或很多个 ...
- redis 可视化管理工具
Redis Desktop Manager 下载地址:http://redisdesktop.com/download 支持: Windows 7+, Mac OS X 10.10+, Ubuntu ...
- js设计模式-发布/订阅模式
一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...
- (转) 淘淘商城系列——解决KindEditor上传图片浏览器兼容性问题
http://blog.csdn.net/yerenyuan_pku/article/details/72808229 上文我们已实现了图片上传功能,但是有个问题,那就是对浏览器兼容性不够,因为Map ...
- shellinabox的安装使用
一.简介 Shell In A Box(发音是shellinabox)是一款基于Web的终端模仿器,由Markus Gutschke开辟而成.它有内置的Web办事器,在指定的端口上作为一个基于Web的 ...
- 类unix系统 递归删除指定文件
递归删除当前目录下所有以 ._开头的文件 find . -name "._*" | xargs rm -f 或者: find . -name "._*" -ex ...
- Django中使用多线程发送邮件
1.settings.py 增加Email设置 #mail EMAIL_HOST = ‘smtp.gmail.com’ #邮件smtp服务器 EMAIL_POR ...
- count() 方法
count() :方法用于统计字符串里某个字符出现的次数.可选参数为在字符串搜索的开始与结束位置. num1,num2 = input('请输入字符串:'),input('请输入要查询的子串:') p ...
- 查找BUG的方法
1)测试环境 1)代码调试 2)问题重现 3)思考问题所在 2)生产环境 1)思考 2)测试本地环境是否存在问题 3)打开日志查看 4)思考是否是数据原因 5)拷贝数据到本地进行重现 3)未知错误 1 ...
- C++ typedef用法小结 (转载)
声明:本文转自charley_yang,点击此处查看原文 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // ...