资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Python

八、Django之cookie、session

Python 更新时间: 发布时间: 计算机考试归档 最新发布

八、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文件 ,如下:




    
    Title


运行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文件,如下:




    
    Title


hello:{{ username }} 


清理浏览器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,如下:




    
    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

有时候需要在浏览器退出登录,此时需要清理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的数据

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

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/934658.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【八、Django之cookie、session】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2