HTTP协议的无保存状态,对两次请求没有任何关联。每次请求都是相互独立的。

1、cookie简介

什么是会话跟踪技术
我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束。在通话过程中,你会向10086发出多个请求,那么这多个请求都在一个会话中。
在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。 在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下:  请求银行主页;

  • 请求登录(请求参数是用户名和密码);
  • 请求转账(请求参数与转账相关的数据);
  • 请求信誉卡还款(请求参数与还款相关的数据)。
    在这上会话中当前用户信息必须在这个会话中共享的,因为登录的是张三,那么在转账和还款时一定是相对张三的转账和还款!这就说明我们必须在一个会话过程中有共享数据的能力。

 会话路径技术使用Cookie或session完成
我们知道HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪!在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术。

什么叫Cookie
Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie是key-value结构,类似于一个python中的字典。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!

Cookie规范

  • Cookie大小上限为4KB;
  • 一个服务器最多在客户端浏览器上保存20个Cookie;
  • 一个浏览器最多保存300个Cookie;
    上面的数据只是HTTP的Cookie规范,但在浏览器大战的今天,一些浏览器为了打败对手,为了展现自己的能力起见,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!但也不会出现把你硬盘占满的可能!

注意,不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把IE保存的Cookie发送给服务器。

Cookie与HTTP头
Cookie是通过HTTP请求和响应头在客户端和服务器端传递的:

  • Cookie:请求头,客户端发送给服务器端;
  • 格式:Cookie: a=A; b=B; c=C。即多个Cookie用分号离开;  Set-Cookie:响应头,服务器端发送给客户端;
  • 一个Cookie对象一个Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C

Cookie的覆盖
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

cookie具体一个浏览器,针对一个服务器存储key-value({ })

浏览器发送请求的时候带着cookie,会存在http请求头里;浏览器用的时候它会取出来,它还可以设置

cookieSession文件夹

models

from django.db import models

# Create your models here.
class UserInfo(models.Model): user = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)

views

from django.shortcuts import render, HttpResponse,redirect

# Create your views here.

from app01.models import UserInfo
def login(request):
if request.method == "POST":
user=request.POST.get("user")
pwd = request.POST.get("pwd")
user = UserInfo.objects.filter(user=user,pwd=pwd).first()
if user: #登录成功
#登录成功
'''
响应体:
return HttpResponse 实际上返回的都是HttpResponse,下面两个是封装的
return render
return redirest
'''
response = HttpResponse("登录成功") #设置cookie
response.set_cookie("username",user.user) #对响应体设置cookie
return response
return render(request,"login.html") #如果失败了还是返回那个页面 def index(request):
print(request.COOKIES) #{'__guid': '96992031.3530530351233503700.1511858780574.1208', 'csrftoken': 'mw0zfwWPTBh7c9cRTRNep8aKvEPBa2azgwEC9xchBFfb3bGaayK1ICVXR2DgrpSl'}
is_login = request.COOKIES.get("is_login") #取的时候 COOKIES其实是一个字典,封装了所有的cookie键值;HttpResponse、render、redirest都可以调用;它们三个最终都是HttpResponse的实例对象
if is_login:
username = request.COOKIES.get("username")
return render(request,"index.html",{"username":username})
else:
return redirect("/login/")

login

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
用户名<input type="text" name="user">
密码<input type="text" name="pwd">
<input type="submit" value="submit">
</form>
</body>
</html>

index

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>Hi,{{ username }}</h3>
</body>
</html>

访问login登录页面

当访问index页面时候,它还是带着cookie的

一次登录成功了设置好了cookie,以后什么时候都带着cookie;当你换一个浏览器访问的时候又是新的了;浏览器和服务器请求要是一对一的,当你在这个页面带着cookie时,比如去访问京东这个cookie就没有了;

如果登录另外一个人的账号,就会把之前的那个cookie值给覆盖掉。

HttpResponseBase是HttpResponse的父类,它们三个都是HttpResponse,所有都有set_cookie的方法

设置cookie参数

'''
class HttpResponseBase: def set_cookie(self, key, 键
             value='', 值
             max_age=None, 超长时间
                              cookie需要延续的时间(以秒为单位)
                              如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止。              expires=None, 超长时间
                          expires默认None ,cookie失效的实际日期/时间。
                                          path='/', Cookie生效的路径,
浏览器只会把cookie回传给带有该路径的页面,这样可以避免将
cookie传给站点中的其他的应用。
/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
            
domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。
如, domain=".example.com"
所构造的cookie对下面这些站点都是可读的:
www.example.com 、 www2.example.com
                         和an.other.sub.domain.example.com 。
如果该参数设置为 None ,cookie只能由设置它的站点读取。              secure=False, 如果设置为 True ,浏览器将通过HTTPS来回传cookie。
             httponly=False 只能http协议传输,无法被JavaScript获取
(不是绝对,底层抓包可以获取到也可以被覆盖)
          ): pass '''

超长时间参数

views

def login(request):
if request.method == "POST":
user=request.POST.get("user")
pwd = request.POST.get("pwd")
user = UserInfo.objects.filter(user=user,pwd=pwd).first()
if user:
#登录成功
'''
相应体:
return HttpResponse
return render
return redirest
'''
response = HttpResponse("登录成功") #设置cookie
#response.set_cookie("is_login",True,max_age=15) #设置超时时间为max_age=15,过了15s就获取不了cookie了
response.set_cookie("is_login",True)
import datetime
date = datetime.datetime(year=2018,month=6,day=3,hour=16,minute=28,second=9) #固定在哪一时刻失效 response.set_cookie("username",user.user,expires=date)
return response
return render(request,"login.html")

有效路径参数

views

from django.shortcuts import render, HttpResponse,redirect

# Create your views here.

from app01.models import UserInfo
def login(request):
if request.method == "POST":
user=request.POST.get("user")
pwd = request.POST.get("pwd")
user = UserInfo.objects.filter(user=user,pwd=pwd).first()
if user:
#登录成功
'''
相应体:
return HttpResponse
return render
return redirest
'''
response = HttpResponse("登录成功") #设置cookie
#response.set_cookie("is_login",True,max_age=15) #设置超时时间为max_age=15,过了15s就获取不了cookie了
response.set_cookie("is_login",True)
import datetime
#date = datetime.datetime(year=2018,month=6,day=3,hour=16,minute=28,second=9) #固定在哪一时刻失效 #response.set_cookie("username",user.user,expires=date)
response.set_cookie("username",user.user,path="/index/") #只是指定的路径,哪些视图函数能取到,path="/"默认是根路径
return response
return render(request,"login.html") def index(request):
print(“index:”, request.COOKIES) #{'__guid': '96992031.3530530351233503700.1511858780574.1208', 'csrftoken': 'mw0zfwWPTBh7c9cRTRNep8aKvEPBa2azgwEC9xchBFfb3bGaayK1ICVXR2DgrpSl'}
  #index: {'username': 'yuan', 'csrftoken': 'i1XjCb7mAKefMkNzUUqIvjHpL598C6IC8V0u0AKkPdh03eL7NzPvExLSBE1eLxOA', 'is_login': 'True', 'last_visit_time': '2018-08-19 14:29:32'}
is_login = request.COOKIES.get("is_login") #取的时候
if is_login:
username = request.COOKIES.get("username")
return render(request,"index.html",{"username":username})
else:
return redirect("/login/") def test(request):
print("test",request.COOKIES)
#test {'csrftoken': 'i1XjCb7mAKefMkNzUUqIvjHpL598C6IC8V0u0AKkPdh03eL7NzPvExLSBE1eLxOA', 'is_login': 'True', 'last_visit_time': '2018-08-19 16:20:53'}
return HttpResponse("test")

删除cookie(也可以从浏览器中在设置里边清除cookie记录)

response.delete_cookie("cookie_key",path="/",domain=name)

保存上次访问时间

在设置里边把它改了

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/shanghai'

views

from django.shortcuts import render, HttpResponse,redirect

# Create your views here.

from app01.models import UserInfo
def login(request):
if request.method == "POST":
user=request.POST.get("user")
pwd = request.POST.get("pwd")
user = UserInfo.objects.filter(user=user,pwd=pwd).first()
if user:
#登录成功
'''
相应体:
return HttpResponse
return render
return redirest
'''
response = HttpResponse("登录成功") #设置cookie
#response.set_cookie("is_login",True,max_age=15) #设置超时时间为max_age=15,过了15s就获取不了cookie了
response.set_cookie("is_login",True)
import datetime
#date = datetime.datetime(year=2018,month=6,day=3,hour=16,minute=28,second=9) #固定在哪一时刻失效 #response.set_cookie("username",user.user,expires=date)
response.set_cookie("username",user.user,path="/index/") #只是指定的路径,哪些视图函数能取到
return response
return render(request,"login.html") def index(request):
print("index:",request.COOKIES) #{'__guid': '96992031.3530530351233503700.1511858780574.1208', 'csrftoken': 'mw0zfwWPTBh7c9cRTRNep8aKvEPBa2azgwEC9xchBFfb3bGaayK1ICVXR2DgrpSl'}
is_login = request.COOKIES.get("is_login") #取的时候
if is_login:
username = request.COOKIES.get("username")
import datetime
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") #拿到当前时间,我要的是年月日时分秒加个striftime
last_time = request.COOKIES.get("last_visit_time","") #每次从cookie中取下时间,下边刚刚设置了"last_visti_time", ""加不加无所谓
response = render(request,"index.html",{"username":username,"last_time":last_time})
response.set_cookie("last_visit_time",now) #设置上次登录时间的cookie
return response #再把响应体交换过来。
else:
return redirect("/login/") def test(request):
print("test",request.COOKIES) return HttpResponse("test")

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>Hi,{{ username }}</h3>
<h3>上次登录时间{{ last_time }}</h3>
</body>
</html>

2、session

Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。

保存登录状态信息

写session,读session

views.py

def login_session(request):
if request.method == "POST":
user=request.POST.get("user")
pwd = request.POST.get("pwd")
user = UserInfo.objects.filter(user=user,pwd=pwd).first() if user: #登录成功了
request.session['is_login']=True #在里边加一个键值
request.session['username']=user.user '''
1.生成随机字符串 km6d8dwp98z70n62vls0jylngi1ztnlj
2.response.set_cookie("session",km6d8dwp98z70n62vls0jylngi1ztnlj)
3.在django-session表中创建一条记录:
session-key session-data
km6d8dwp98z70n62vls0jylngi1ztnlj {"is_login":True,"username":"kris"}
'''
return HttpResponse("登录成功")
return render(request, "login.html") def index_session(request): print("is_login:",request.session.get("is_login")) #打印True or False #基于这个来判断是否之前有登录过
  
'''
1.request.COOKIE.get("session") #km6d8dwp98z70n62vls0jylngi1ztnlj
2.django_cookie表中过滤记录:
在django-session表中创建一条记录:
session-key session-data
km6d8dwp98z70n62vls0jylngi1ztnlj {"is_login":True,"username":"kris"}
obj=django-session.objects filter(session-key=km6d8dwp98z70n62vls0jylngi1ztnlj).first()
3.obj.session-data.get("is_login")
'''
is_login=request.session.get("is_login") #登录成功为True
if not is_login:
return redirect("/login_session/") username = request.session.get("username") #把username取出来
return render(request,"index.html",{"username":username})

session应用之保存上次登录时间、session的更新操作、注销功能与参数配置

views.py

def login_session(request):
if request.method == "POST":
user=request.POST.get("user")
pwd = request.POST.get("pwd")
user = UserInfo.objects.filter(user=user,pwd=pwd).first() if user: #登录成功了
import datetime
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
request.session['is_login']=True
request.session['username']=user.user
request.session["last_visit_time"]=now
'''
if request.COOKIE.get("sessionid"): #如果在浏览器中能读出这个随机键值对,就做一个更新操作。(就是说换用户登录了)
更新
response.set_cookie("session",km6d8dwp98z70n62vls0jylngi1ztnlj)
在django-session表中更新这条记录:
    session-key(更新,这个值是不变的) session-data
km6d8dwp98z70n62vls0jylngi1ztnlj 更新的数据
else: #如果第一次登录,给它来个添加操作。
1.生成随机字符串 km6d8dwp98z70n62vls0jylngi1ztnlj
2.response.set_cookie("session",km6d8dwp98z70n62vls0jylngi1ztnlj) #给响应体设置set_cookie
3.在django-session表中创建一条记录:
session-key session-data(django给你做的序列化,其实就是一个字典)
km6d8dwp98z70n62vls0jylngi1ztnlj(随机字符串) {"is_login":True,"username":"kris"}
'''
return HttpResponse("登录成功")
return render(request, "login.html") def index_session(request): print("is_login:",request.session.get("is_login")) '''
1.request.COOKIE.get("session") #km6d8dwp98z70n62vls0jylngi1ztnlj
2.django_cookie表中过滤记录:
在django-session表中创建一条记录:
session-key session-data
km6d8dwp98z70n62vls0jylngi1ztnlj {"is_login":True,"username":"kris"}
obj=django-session.objects filter(session-key=km6d8dwp98z70n62vls0jylngi1ztnlj).first()
3.obj.session-data.get("is_login") #把字典取出来。
'''
is_login=request.session.get("is_login")
if not is_login:
return redirect("/login_session/") username = request.session.get("username")
last_visit_time = request.session.get("last_visit_time") #把上次登录时间取出来
return render(request,"index.html",{"username":username,"last_visit_time":last_visit_time}) def logout(request):
#del request.session["is_login"] request.session.flush() #删除当前会话数据并删除会话的cookie '''
1.randon_str=request.COOKIE.get("sessioned")
2.django-session.objects.filter(session-key=randon_str).delete() #过滤下并直接delete,把整条记录都删除了(服务器的)
3.response.delete_cookie("sessionid",randon_str) #删除cookie
''' return redirect("/login/")

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>Hi,{{ username }}</h3>
<h3>上次登录时间{{ last_visit_time }}</h3>
<a href="/logout/">注销</a>
</body>
</html>

settings.py

#SESSION_COOKIE_NAME='kris'
SESSION_COOKIE_NAME ="sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_AGE = 2*7*24*3600 #10 # Session的cookie失效日期(2周)(默认) 10s之内有效
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认);如果改成True时,你一直刷新页面,10s之后也不会失效,但一停止点击刷新过10s就会失效。

总结

1 response.set_cookie(key,value)设置,response响应体来设置
2 request.COOKIE.get(key) 读
3 request.session[key]=value 写session
  Django的实现流程:
if request.COOKIE.get("sessionid"):
更新
response.set_cookie("session",km6d8dwp98z70n62vls0jylngi1ztnlj)
在django-session表中创建一条记录:
session-key session-data
km6d8dwp98z70n62vls0jylngi1ztnlj 更新的数据
else:
1.生成随机字符串 km6d8dwp98z70n62vls0jylngi1ztnlj
2.response.set_cookie("session",km6d8dwp98z70n62vls0jylngi1ztnlj)
3.在django-session表中创建一条记录:
session-key session-data
km6d8dwp98z70n62vls0jylngi1ztnlj {"is_login":True,"username":"kris"}
4 request.session[key] 读session
1.request.COOKIE.get("session") #km6d8dwp98z70n62vls0jylngi1ztnlj
2.django_cookie表中过滤记录:
在django-session表中创建一条记录:
session-key session-data
km6d8dwp98z70n62vls0jylngi1ztnlj {"is_login":True,"username":"kris"}
obj=django-session.objects filter(session-key=km6d8dwp98z70n62vls0jylngi1ztnlj).first()
3.obj.session-data.get("is_login") 5 request.session.flush() 1.randon_str=request.COOKIE.get("sessioned")
2.django-session.objects.filter(session-key=randon_str).delete()
3.response.delete_cookie("sessionid",randon_str)

9.Django组件-cookie和session的更多相关文章

  1. Django组件 - cookie、session、用户认证组件

    一.cookie 1.会话跟踪技术 1)什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话 ...

  2. Django组件-cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...

  3. web框架开发-Django组件cookie与session

    http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...

  4. Django 组件-cookie 与 session

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  5. Django组件——cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应. 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直 ...

  6. 13 Django组件-cookie与session

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  7. 06 Django组件-cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...

  8. Django组件——Cookie与session相关

    一,会话跟踪技术 1 什么是会话跟踪技术我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而1 ...

  9. Django 组件-cookie与session

    Cookie概述 什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中 ...

随机推荐

  1. MongoDB - 日常操作二

    MongoDB 开启认证与用户管理  ./mongo # 先登录 use admin # 切换到admin库 db.addUser(") # 创建用户 db.addUser('zhansan ...

  2. MySQL之当数据库数据源被锁(Table Metadata Lock)时的解决方案

    0.发生的原因分析:[hibernate的线程池连接导致了不能修改被锁定数据库的数据库型模式] 1.关掉hibernate的所有线程池(选择退出IDE或者其他办法) 2.查看被锁的进程ID:show ...

  3. POJ 1200 Crazy Search (哈希)

    题目链接 Description Many people like to solve hard puzzles some of which may lead them to madness. One ...

  4. android view绘制流程 面试

    一.view树的绘制流程 measure--->layout--->draw measure 1.ViewGroup.LayoutParams 指定部件的长宽 2.MeasureSpec ...

  5. java 多线程四

    java 多线程一 java 多线程二 java 多线程三 java 多线程四 一个生产者,消费者的例子: import java.util.Stack; /** * Created by root ...

  6. Debian ifconfig 命令找不到

    如何配置让 Debian 非特权用户也可以使用 ifconfig . ifconfig 在 /sbin 目录下,新建一个用户时, Debian 默认从 /etc/skel/ 复制配置文件, /sbin ...

  7. R-CNN论文详解(转载)

    这几天在看<Rich feature hierarchies for accurate object detection and semantic segmentation >,觉得作者的 ...

  8. UML和模式应用5:细化阶段(10)---UML交互图

    1.前言 UML使用交互图来描述对象间消息的交互 交互图可以用于动态对象建模. 交互图有两种类型:顺序图和通信图. UML交互图将用来解释和阐述对象设计. 2.顺序图和通信图 顺序图具有丰富的符号标记 ...

  9. nagios监控客户端报错/usr/bin/perl^M: bad interpreter: No such file or directory

    nagios服务端监控客户端内存时发现监控不上 在客户端直接执行脚本,报错如下: # /usr/local/nagios/libexec/check_memory.pl -w 6% -c 3% -ba ...

  10. 通达OA在centos系统中快速部署文档(web和数据库)

    通达OA2008从windows环境移植到linux中(centos5.5及以上版本) 如果安装好了,还是无法访问,则需要清空浏览器缓存即可 1.安装lamp环境,这里用的是xampp集成安装包xam ...