Cookie  曲奇饼干  哈哈哈。通俗的将,应该是发票。

因为http是无状态操作

当你访问服务器之后,应该会给你响应发票Cookie记录你访问了什么东西

便于下次再来查找吧,Cookie有时间的限制。默认是在存储在浏览器的,关闭浏览器之后就会消失了

设置了时间的话就会在本地生成数据了

本一节课就讲了普通的Cookie设置和获取

客户端保存数据

设置cookie

  1. 普通

response.set_cookie("uname","zhangsan",expires=value,path='/' )

  1. 加盐

普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看

response.set_signed_cookie('k','v',salt="fdsa")

获取cookie

  1. 普通

request.COOKIES['hello']
request.COOKIES.get('hello','')
  1. 加盐

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记录着

会默认的保存到数据库中的

  1. cookie引入session:

    cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患。

  2. cookie+session 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串)基于以上原因:cook+session组合就此作古了单单使用cookie做会话保持的方式;

  3. cookie+session的工作流程:

    (1)、当用户来访问服务端时,服务端生成一个随机字符串;

    (2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;

    (3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;

  1. 保存在服务端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的更多相关文章

  1. 2019.03.23 Http

    自己也要分清楚  看清楚 request,response 一个是请求  一个是相应 行 头    之间还有个空行    体 HttpRequest请求对象(只读) 当用户访问一个视图函数时,Djan ...

  2. 2019.03.03 - Linux搭建go语言交叉环境

    编译GO 1.6版本以上的需要依赖GO 1.4版本的二进制,并且需要把GOROOT_BOOTSTRAP的路径设置为1.4版本GO的根目录,这样它的bin目录就可以直接使用到1.4版本的GO 搭建go语 ...

  3. [2019.03.25]Linux中的查找

    TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...

  4. Beta冲刺(2/7)——2019.5.23

    所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(2/7)--2019.5.23 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...

  5. [2019.03.16]使用DOM操作函数和CSS选择器来针对已有的HTML进行只凭JS的改动

    刚入职的时候看到公司用的HTML日志生成工具附带的Panel,工具不够用,找个Fail还要找半天,于是自己琢磨着添砖加瓦.以前也是个半吊子前端工程师,现在可倒好,想要改页面却连页面生成的模板在哪里都不 ...

  6. 2019.03.30 图解HTTP

    文章来源<图解HTTP> 第一章 了解Web及网络基础 你有想过当你在浏览器(web browser)的地址栏上输入URL时,Web页面是如何实现的吗? 嗯,好像也没想过 web使用一种名 ...

  7. 2019.03.30 Dialog demo 一个标准使用的dialog程序

    PROGRAM zdemo_dialog. INCLUDE zdemo_dialogtop. INCLUDE zdemo_dialogo01. INCLUDE zdemo_dialogi01. INC ...

  8. 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 ...

  9. QFNU-ACM 2019.5.23组队赛 2019山东省赛复现

    A.Calandar 题意:一年12个月,一个月30天,5天一周,已知某天的年月日星期数,求所给年月日的星期数是多少 思路:直接进行计算,其实每个月每年都是等长度的就使得计算的时候忽略年月,可以直接进 ...

随机推荐

  1. E - 棋盘问题

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...

  2. phpcms v9 的表单向导功能的使用方法 附多个案例

    本文主要介绍phpcms v9的表单向导功能是如何使用的,并副多个案例讲解: 先介绍一下v9 的表单向导如何使用 表单向导做的很实用,生成一个表单,常用的是把它作为一个留言板,或者在招聘栏目作为一个供 ...

  3. day5 五、数字类型、字符串,列表类型的基本操作和内置方法

    一.可变与不可变 可变:值改变,但是id不变,证明就是在改变原值,是可变类型.它的原理是在内存里有一个值,然后这个值发生了改变,意为id地址是同一个,没有变化 # l=['a','b'] # prin ...

  4. 初级ai思维导图,基础人工智能设计图

    2017年2月8日09:35:46 仅供代码和逻辑设计图纸,只提供一个参考设计,后面可能会更新具体实施说明

  5. 一窥Spring Cloud Eureka

    在Spring Cloud中Eureka负责服务发现功能.服务发现需要解决如何找到服务提供者在网络中位置的问题. 服务端 在Spring Tool Suite的文件菜单中,点击新建Spring Sta ...

  6. mysql日期格式转换,如何保持原日期?CONVERT/Substring 函数截取。replace替换

    http://www.cnblogs.com/stevenjson/p/3729577.html CONVERT(varchar(100), getdate(), 112)这种, 问题就出在getda ...

  7. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  8. [No0000188][VCB-Studio 科普教程 2.5] 基于 PotPlayer 和 madVR 的播放器教程(已更新 XySubFilter)

    Potplayer 是高清影视常用的播放器,界面简洁,功能齐全,比 MPC-HC 和 MPC-BE 更人性化:但其默认方案十分糟糕,预设过多错误,无法正确播放 10-bit 视频,一直饱受诟病.VCB ...

  9. 分布式事务之TCC服务设计和实现注意事项

    分布式事务之TCC服务设计和实现注意事项-云栖社区-阿里云 https://yq.aliyun.com/articles/609854 分布式事务之TCC事务丶一个站在Java后端设计之路的男青年个人 ...

  10. 20个有趣的Linux命令

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...