2019.03.23 Cookie
Cookie 曲奇饼干 哈哈哈。通俗的将,应该是发票。
因为http是无状态操作
当你访问服务器之后,应该会给你响应发票Cookie记录你访问了什么东西
便于下次再来查找吧,Cookie有时间的限制。默认是在存储在浏览器的,关闭浏览器之后就会消失了
设置了时间的话就会在本地生成数据了
本一节课就讲了普通的Cookie设置和获取
客户端保存数据
设置cookie
普通
response.set_cookie("uname","zhangsan",expires=value,path='/' )
加盐
普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看
response.set_signed_cookie('k','v',salt="fdsa")
获取cookie
普通
request.COOKIES['hello']
request.COOKIES.get('hello','')
加盐
request.get_signed_cookie('k',salt='fdsa')
删除值
#设置过期
1. 默认情况关闭浏览器就失效
2. max_age=-1(单位秒)
3. expires=datetime.datetime.today()+datetime.timedelta(days=-2)(单位日期类型)
4. response.delete_cookie('login',path='/student/login/')
涉及属性
1、max_age=1 :cookie生效的时间,单位是秒
2、expires:具体过期日期
3、path='/':指定那个url可以访问到cookie;'/'是所有 path='/'
4、domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie
domain='.baidu.com'
语法
#设置cookie
def index_view(request):
import datetime
response = HttpResponse()
# response.set_cookie('hello','123',max_age=24*60*60*3,path='/student/abc/')
# response.set_cookie('hello','123',path='/student/abc/',expires=datetime.datetime.today()+datetime.timedelta(days=4))
response.set_signed_cookie('hello','123',salt='hahaha',path='/student/abc/',expires=datetime.datetime.today()+datetime.timedelta(days=4))
return response
#获取cookie
def abc_view(request):
#返回所有cookie数据
print request.COOKIES
#返回KEY='hello'的数据
print request.get_signed_cookie('hello',salt='hahaha')
return HttpResponse('hello')
session就是会话的意思,也就比较像吧,也是说在这个会话中数据会一直被session记录着
会默认的保存到数据库中的
cookie引入session:
cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患。
cookie+session 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串)基于以上原因:cook+session组合就此作古了单单使用cookie做会话保持的方式;
cookie+session的工作流程:
(1)、当用户来访问服务端时,服务端生成一个随机字符串;
(2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;
(3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;
保存在服务端session数据格式session_key SessionStore()
{
session_key 数据字典
sessionid1: {id:1,nam:"alex",account:1000000000 },
sessionid2: {id:1,nam:"eric",account:10}
}
Session中存储值
def session_view(request):
# SessionStore()
#设置session数据
# request.session['user']='zhangsan'
#设置过期时间(单位秒)
# request.session.set_expiry(10*60)
#删除当前user对应的session数据
# del request.session['user']
#删除所有session数据(不清空数据库,只删除cookie中的sessionid)
# request.session.clear()
#清空数据库中的session数据
# request.session.flush()
#获取sessionid
# print request.session.session_key
return HttpResponse('保存成功!')
Session中取值
def getsession_view(request):
#session中取值
user = request.session['user']
# user = request.session.get('user')
return HttpResponse('datas:%s'%user)
Session存储引擎
#settings.py文件中
#Session默认存储在数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
#内存
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# 可以存储自定义对象,内存不用json序列化
# 服务器重启,数据丢失 #内存+数据库(双缓存)
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
# 内存速度快,数据库慢
# 储存的步骤,先存到内存,在存到数据库
# 先从内存读,再从数据库读,如果从数据库读到了,再放入内存
#file SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = os.getcwd()
#signed_cookies
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
# 将数据加密,存到cookie中了(存到浏览器)
将数据保存到Redis数据库中
pip install django-redis-sessions==0.5.6
# 使用redis保存session数据
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 4
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'
登录用户信息保存session
配置URL
#coding=utf-8
from django.conf.urls import url
import views
urlpatterns=[
url(r'^sessionlogin/$',views.sessionlogin_view),
url(r'^usercenter/$',views.center_view),
]
创建视图函数
class User(object):
def __init__(self,uname,pwd):
self.uname = uname
self.pwd = pwd
import jsonpickle
def sessionlogin_view(request):
uname = request.GET.get('uname','')
pwd = request.GET.get('pwd','')
if uname=='zhangsan' and pwd=='123':
user = User(uname,pwd)
request.session['user'] = jsonpickle.dumps(user)
return HttpResponseRedirect('/student/usercenter/')
return HttpResponse('登录失败')
def center_view(request):
user = jsonpickle.loads(request.session['user'])
return HttpResponse('欢迎%s登录成功!'%user.uname)
jsonpickle序列化和反序列化
#coding=utf-8
from django.http import HttpResponse
from django.views import View
import jsonpickle
class User(object):
def __init__(self,uname,pwd):
self.uname = uname
self.pwd = pwd
class IndexView(View):
def get(self,request,*args,**kwargs):
uname = request.GET.get('uname','')
pwd = request.GET.get('pwd','')
if uname=='zhangsan' and pwd=='123':
user = User(uname,pwd)
#{"py/object": "demo5.views.User", "uname": "zhangsan", "pwd": "123"}
# ustr = jsonpickle.encode(user)
# {"py/object": "demo5.views.User", "uname": "zhangsan", "pwd": "123"}
ustr =jsonpickle.dumps(user)
print ustr
request.session['user'] = ustr
return HttpResponse('Get请求')
class GetSession(View):
def get(self,request,*args,**kwargs):
user = request.session.get('user','')
# <demo5.views.User object at 0x0000000003D48588>
# uuser = jsonpickle.decode(user)
# <demo5.views.User object at 0x0000000003D1A0F0>
uuser = jsonpickle.loads(user)
print uuser
return HttpResponse('User:%s'%uuser.uname)
序列化部分字段
class User(object):
def __init__(self,uname,pwd):
self.uname = uname
self.pwd = pwd
def __getstate__(self):
data = self.__dict__.copy()
del data['pwd']
return data
u = User('zhangsan','123')
s = jsonpickle.encode(u,unpicklable=False)
# jsonpickle.dumps(u,unpicklable=False)
print s
#{"uname": "zhangsan"}
2019.03.23 Cookie的更多相关文章
- 2019.03.23 Http
自己也要分清楚 看清楚 request,response 一个是请求 一个是相应 行 头 之间还有个空行 体 HttpRequest请求对象(只读) 当用户访问一个视图函数时,Djan ...
- 2019.03.03 - Linux搭建go语言交叉环境
编译GO 1.6版本以上的需要依赖GO 1.4版本的二进制,并且需要把GOROOT_BOOTSTRAP的路径设置为1.4版本GO的根目录,这样它的bin目录就可以直接使用到1.4版本的GO 搭建go语 ...
- [2019.03.25]Linux中的查找
TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...
- Beta冲刺(2/7)——2019.5.23
所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(2/7)--2019.5.23 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...
- [2019.03.16]使用DOM操作函数和CSS选择器来针对已有的HTML进行只凭JS的改动
刚入职的时候看到公司用的HTML日志生成工具附带的Panel,工具不够用,找个Fail还要找半天,于是自己琢磨着添砖加瓦.以前也是个半吊子前端工程师,现在可倒好,想要改页面却连页面生成的模板在哪里都不 ...
- 2019.03.30 图解HTTP
文章来源<图解HTTP> 第一章 了解Web及网络基础 你有想过当你在浏览器(web browser)的地址栏上输入URL时,Web页面是如何实现的吗? 嗯,好像也没想过 web使用一种名 ...
- 2019.03.30 Dialog demo 一个标准使用的dialog程序
PROGRAM zdemo_dialog. INCLUDE zdemo_dialogtop. INCLUDE zdemo_dialogo01. INCLUDE zdemo_dialogi01. INC ...
- Cheatsheet: 2019 03.01 ~ 04.30
Golang How To Install Go and Set Up a Local Programming Environment on macOS Build A Go API 40+ prac ...
- QFNU-ACM 2019.5.23组队赛 2019山东省赛复现
A.Calandar 题意:一年12个月,一个月30天,5天一周,已知某天的年月日星期数,求所给年月日的星期数是多少 思路:直接进行计算,其实每个月每年都是等长度的就使得计算的时候忽略年月,可以直接进 ...
随机推荐
- db2 查杀死锁进程
db2 查杀死锁进命令 db2 get snapshot for locks on (需要snapshot的访问权限) db2 list applications db2 "force ap ...
- TOP100summit:【分享实录-美团点评】 业务快速升级发展背后的系统架构演进
本篇文章内容来自2016年TOP100summit美团●大众点评高级技术专家,酒店后台研发组eHome团队负责人许关飞的案例分享.编辑:Cynthia 许关飞:美团●大众点评高级技术专家,酒店后台研发 ...
- sqlServer自动代码提示功能
第一种方法: 首先确认 自己的sqlServer2008自身的提示功能有没有被屏蔽了! 打开sqlserver2008 -- 工具 -- 选项 -- 文本编辑器 -- 所有语言 -- 勾选 语句结束 ...
- [No0000FB]C# 命名空间(Namespace)
命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式.在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突. 定义命名空间 命名空间的定义是以关键字 namespace ...
- Gym - 101375H MaratonIME gets candies 交互题
交互题介绍:https://loj.ac/problem/6 题意:输出Q X ,读入><= 来猜数,小于50步猜出就算过样例 题解:根本不需要每次输出要打cout.flush()... ...
- 单周期CPU设计的理论基础
写在前面:本博客内容为本人老师原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法UR ...
- [administrative][CentOS][NetworkManager] 万恶的NetworkManager到底怎么用
这好像是第三次不得不去学会NetworkManager的用法,可是它真的很难用.社区里无人不吐槽. 然而,还是要用! 这次从redhat的文档入手,也许可以成功 --! https://access. ...
- HTML中select的option设置selected="selected"无效的解决方案
今天遇到了一个奇葩问题,写HTML时有个select控件,通过设置option的selected="selected"居然无效,但是在其他浏览器是可以的,问了一下Google大神, ...
- Struts2验证框架_xml验证失败
测试Struts2验证框架-->XML验证 启动tomcat后网页登录失败 Employee-validation.xml文件头如下: <!DOCTYPE validators PUB ...
- 20165336 2017-2018-2 《Java程序设计》第1周学习总结
20165336 2017-2018-2 <Java程序设计>第1周学习总结 教材学习内容总结 Java地位.特点:Java具有面向对象.与平台无关.安全.稳定和多线程等优良特性.Java ...