一、COOKIE
什么是cookie
在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文件 ,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post">
<input type="text" name="name" placeholder="名称">
<input type="text" name="pwd" placeholder="密码">
<input type="submit" value="提交">
</form>
</body>
</html>
运行Django程序,访问界面如下:
可以看到生成了cookie信息(响应)
登录成功之后,返回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 = 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文件,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello:{
{ username }} </h1>
</body>
</html>
清理浏览器cookie,重新访问,如下:
二、SESSION
session定义
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,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post">
<input type="text" name="name" placeholder="名称">
<input type="text" name="pwd" placeholder="密码">
<input type="submit" value="提交">
</form>
</body>
</html>
编辑templates/shome.html,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello:{
{ username }} </h1>
</body>
</html>
启动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文件,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello:{
{ username }} ,上次登录时间为{
{ last_time }}</h1> ##添加时间
</body>
</html>
如下,直接访问(http://127.0.0.1:8000/home/)会出现以下问题,因为session中没有携带time时间
先访问login,如下:
查看数据库,django_session中的数据会进行更新
清理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文件,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/logout/">注销</a> ###添加注销按钮
<h1>hello:{
{ username }} ,上次登录时间为{
{ last_time }}</h1>
</body>
</html>
访问界面如下:
点击注销之后,查看login的请求中已经没有了cookie的数据
session配置
# 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,默认修改之后才保存(默认)