八、Django之cookie、session

一、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,默认修改之后才保存(默认)

猜你喜欢

转载自blog.csdn.net/weixin_40579389/article/details/125050926