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 ...
随机推荐
- 【PostgreSQL-9.6.3】进程及体系结构
本文主要讲述了PG的几个主要进程,以及PG的核心架构.进程和体系结构详见下图: 从上面的体系结构图可以看出来,PG使用经典的C/S架构,进程架构.在服务器端有主进程.服务进程.子进程.共享内存以及文件 ...
- arcpy利用XY创建点
# -*- coding: utf-8 -*-"""Created on Sun Apr 7 15:32:24 2019@author: ""&quo ...
- 循环冗余校验(CRC)算法入门
http://blog.csdn.net/liyuanbhu/article/details/7882789 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ...
- 获取select标签选中的值的三种方式
var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = obj.selectedIndex; // 选中索引 va ...
- jquery.data.resource.js
/*! * jQeury Data Pkugin * version: 1.0.0-2016.03.03 * Requires jQuery v1.10.2 or later * Copyright ...
- HDFS的Java API 对文件的操作
在本次操作中所用到的命令 1.首先启动HDFS $HADOOP_HOME/sbin/start-dfs.sh 2.关防火墙 切换到root用户,执行service iptables stop 3.拷贝 ...
- <Linux> 下安装和卸载JDK
安装 下载jdk https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 在local ...
- php实现短信验证
PHP实现短信验证的整体思路: 一.申请短信api ->申请网址https://s1.chanyoo.cn/login?url=%2f 二.编写核心代码(thinkPHP5) 示例: <? ...
- 3.2.11 行 vs 字符串
了解行(line)与字符串(string)的差异是相当重要的.大部分简易程序都是处理输入数据的行,像 grep 与 egrep,以及 sed 大部分的工作(99%)都是这样.在这些情况下,不会 ...
- NOR flash and NAND flash
(1)读写的基本单位 应用程序对NOR芯片操作以"字"为基本单位.为了方便对大容量NOR闪存的管理,通常将NOR闪存分成大小为128KB或者64KB的逻辑块,有时候块内还分成扇区. ...