博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019.03.23 Cookie
阅读量:4669 次
发布时间:2019-06-09

本文共 5839 字,大约阅读时间需要 19 分钟。

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"}

转载于:https://www.cnblogs.com/Py-king/p/10584423.html

你可能感兴趣的文章
keil5 配置 stm32f103rc 软件仿真
查看>>
RESTful到底是什么玩意??
查看>>
Oracle创建视图的一个问题
查看>>
(一)线性表
查看>>
hdu 1003 Max Sum (DP)
查看>>
mysql增备
查看>>
[APIO2015]雅加达的摩天楼
查看>>
andorid之帧布局FrameLayout
查看>>
(转,记录用)jQuery页面加载初始化的3种方法
查看>>
C++常量的引用 const
查看>>
51nod 1101 换零钱 【完全背包变形/无限件可取】
查看>>
python单例设计模式(待补充)
查看>>
Binary Tree Inorder Traversal
查看>>
HDU 1394 Minimum Inversion Number (数据结构-线段树)
查看>>
ansible-playbook && Roles && include
查看>>
String s String s=null和String s="a"区别
查看>>
[Alpha阶段]第二次Scrum Meeting
查看>>
关于Java 8 forEach
查看>>
.NET设计模式(1):1.1 单例模式(Singleton Pattern)
查看>>
创建模态对话框和非模态对话框
查看>>