在HTTP中它表示服务器送给客户端浏览器的响应数据。其实Cookie是key-value结构,类似于一个python中的字典。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,cookie大部分都是加密的,cookie存在与缓存中或者硬盘中,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
cookie访问原理 cookie模拟登陆 创建app,添加路由编辑urls.py文件,添加login以及home路径,如下:
from django.contrib import admin from django.urls import path from cookie import views urlpatterns = [ path('admin/', admin.site.urls), path('login/',views.login), path('home/',views.home), ]添加视图函数
编辑视图函数views.py,如下:
from django.shortcuts import render,redirect,HttpResponse # Create your views here. def login(request): user = request.POST.get("name") if request.method == "GET": return render(request,"login.html") else: res = HttpResponse("登录成功") res.set_cookie("islogin","true",max_age=10) ##此处设置cookie res.set_cookie("username",user) ###设置登录用户信息 return res def home(request): if request.COOKIES.get("islogin") == "true": user = request.COOKIES.get("username") return render(request,"home.html",{"username": user}) else: return redirect("/login/")
添加templates目录。并编辑login.html文件 ,如下:
Title
运行Django程序,访问界面如下:
可以看到生成了cookie信息(响应)
编辑views.py文件,如下:
from django.shortcuts import render,redirect,HttpResponse # Create your views here. def login(request): user = request.POST.get("name") if request.method == "GET": return render(request,"login.html") else: res = redirect("/home/") res.set_cookie("islogin","true",max_age=10) ##此处设置cookie,设置有效期为10S res.set_cookie("username",user) ###设置登录用户信息 return res def home(request): if request.COOKIES.get("islogin") == "true": ##判断是否有cookie信息 user = request.COOKIES.get("username") ###回去登录的用户 return render(request,"home.html",{"username": user}) else: return redirect("/login/")
编辑home.html文件,如下:
Title hello:{{ username }}
清理浏览器cookie,重新访问,如下:
Cookie弥补了HTTP⽆状态的不⾜,让服务器知道来的⼈是“谁”;但是Cookie以⽂本的形式保存在本地,⾃⾝安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本
Django 提供对匿名会话(session)的完全支持。这个会话框架让你可以存储和取回每个站点访客任意数据。它在服务器端存储数据, 并以cookies的形式进行发送和接受数据。session其实是一个会话类,requests的所有请求方法,底层都是调用的这个类的对象。⽀持更多的字节(大于4096字节),并且他保存在服务器,有较⾼的安全性
session流程图 session语法案例 添加路由创建名为session的app,编辑全局配置配置文件urls.py,如下:
from django.contrib import admin from django.urls import path from session import views ###导入session视图 urlpatterns = [ path('admin/', admin.site.urls), path('login/',views.login), ###添加登录路由 path('home/',views.home), ###添加主页路由 ]编辑视图函数
编辑views.py文件,如下:
from django.shortcuts import render,redirect,HttpResponse def login(request): if request.method == "GET": return render(request,"slogin.html") else: user = request.POST.get("name") request.session["name"] = user ###设置session return redirect("/home/") def home(request): user = request.session.get("name") if user: ###判断session是否存在 return render(request,"shome.html",{"username": user}) else: return redirect("/login")
编辑templates/slogin.html,如下:
Title
编辑templates/shome.html,如下:
Title hello:{{ username }}
启动Django程序,访问界面如下:
编辑views.py文件,如下:
def home(request): user = request.session.get("name") import datetime last_login_time = request.session.get("last_time") ###获取时间 last_time = datetime.datetime.now().strftime("%Y-%m-%d %X") ##定义当前时间 request.session["last_time"] = last_time if user: return render(request,"shome.html",{"username": user,"last_time": last_login_time}) else: return redirect("/login")
编辑shome.html文件,如下:
Title hello:{{ username }} ,上次登录时间为{{ last_time }} ##添加时间
如下,直接访问(http://127.0.0.1:8000/home/)会出现以下问题,因为session中没有携带time时间
先访问login,如下:
查看数据库,django_session中的数据会进行更新
有时候需要在浏览器退出登录,此时需要清理session,如下:
编辑urls.py文件,如下:
from django.contrib import admin from django.urls import path from session import views urlpatterns = [ path('admin/', admin.site.urls), path('login/',views.login), path('home/',views.home), path('logout',views.logout), ###添加注销路由 ]
编辑views.py文件,如下:
def logout(request): #方式一、 request.session.flush() ###此种方式会清空所有的session,影响其他url的访问 #方式二 del request.session["name"] ###此方式只是影响当前url,不影响其他登录,一般建议使用此种方法 return redirect("login/")
编辑shome.html文件,如下:
Title 注销 ###添加注销按钮 hello:{{ username }} ,上次登录时间为{{ last_time }}
访问界面如下:
点击注销之后,查看login的请求中已经没有了cookie的数据
# Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_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,默认修改之后才保存(默认)