iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >django会话跟踪技术
  • 947
分享到

django会话跟踪技术

技术django 2023-01-30 22:01:15 947人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录 Django中的会话跟踪技术 什么是会话跟踪技术 Http无状态协议 Cookie概述 什么是cookie

目录

  • Django中的会话跟踪技术
    • 什么是会话跟踪技术
    • Http无状态协议
    • Cookie概述
      • 什么是cookie
      • cookie源码
      • cookie超长时间
      • cookie超长时间
      • cookie生效路径
      • 删除cookie
    • session
      • 为什么用session而不是cookie
      • session的其他方法
      • session的设置
      • 基于session上次登陆时间

什么是会话跟踪技术

首先我们需要了解一下什么是会话?我们可以把会话当作成客户端与服务器之间的一次会晤,在一次会晤期间会有多次请求和响应。例如你打电话给10086客服,那么此时你就是客户端,10086客服就是服务端,那么一次会晤就是你们在打电话期间的聊天过程。直到某一方挂了电话,此时表示会话结束。在你们的通话过程中,你会向10086发送多次请求,那么这些请求都会保存在一个会话中。

javaweb中,客户端向服务器发出第一个请求开始,会话就开始了,直到客户端关闭了浏览器会话结束。

在一次会话中的多个请求需要共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下:

  • 请求银行主页
  • 请求登陆(请求参数是用户名和密码)
  • 请求转账(请求参数与转账相关的数据)
  • 请求信用卡还款(请求参数与还款相关的数据)

在以上这次会话中,当前用户的信息必须是要在这次会话中共享的,因为登陆的是zhangsan,那么转账和还款肯定是用zhangsan用户转账和还款,这就说明我们必须在一个会话过程中有共享数据的能力。

HTTP无状态协议

HTTP协议是一种不保存状态,即无状态协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
1

使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快的处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计的如此简单的。

可是,随着WEB的不断发展,因无状态而导致业务处理变得棘手的情况增多了。比如咱们刚刚说的请求银行、登陆、转账、还款的问题。虽然HTTP协议是无状态协议,但为了实现期望的保持状态功能,于是引入了cookie技术。有了cookie再用HTTP协议通信,就可以管理状态了。

Cookie概述

什么是cookie

cookie翻译成中文是小甜点、小饼干的意思。在HTTP中它表示从服务器送给客户端的小甜点。其实cookie是key-value结构,和python的字典比较类似。随着服务器端的响应发送给客户端浏览器,然后客户端浏览器会把cookie保存起来,当下一次再访问服务器时就把cookie再发送给服务器。

cookie是由服务器端创建,然后通过响应发送给客户端的一个键值对。客户端会保存cookie,并会标注cookie的来源。当客户端向服务器发出请求时会把所有这个服务器cookie的包含在请求中发送给服务器,这样服务器就可以识别客户端了。
2

让我们用代码级别来看一下cookie长什么样子?

首先我们需要新创建一个项目,然后设置路由规则:

urls.py

from app01 import views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
]

views.py

from djanGo.shortcuts import render,HttpResponse,redirect

# Create your views here.


def login(request):
    return render(request, 'login.html')

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login页面</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>

然后在model.py中创建模型类

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)

使用数据库迁移命令来生成数据库

python3 manage.py makemigrations

Python3 manage.py migrate

最后在数据库中插入两条记录:
3

那么当我们把整个项目运行起来后,当我们输入用户名和密码如果正确之后,那么就在浏览器设置一个cookie然后响应给客户端,那么我们需要在views.py中去进行判断了:

from django.shortcuts import render,HttpResponse,redirect
from app01.models import UserInfo
# Create your views here.


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:
            response = HttpResponse('登陆成功')
            response.set_cookie({'is_login': True})
            return response
    
    return render(request, 'login.html')

此时咱们在浏览器输入正确的用户和密码后,让我们看下此次响应的内容:
4

此时的cookie已经放在响应体中了,当客户端向此服务器发送请求的时候,就会携带上这个cookie,当我们刷新此界面,就可以看到了携带了此cookie:
5

那么我们可以去模仿某网站了,如果你登陆过,那么就进入index界面,如果没有那就强制跳转到登陆界面。首先我们要写一条路由规则:

urls.py

from django.contrib import admin
from django.urls import path
from app01 import views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
    path('index/', views.index),
]

views.py

from django.shortcuts import render,HttpResponse,redirect
from app01.models import UserInfo
# Create your views here.


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:
            response = HttpResponse('登陆成功')
            response.set_cookie('is_login', True)
            response.set_cookie('username', user.user)
            return response

    return render(request, 'login.html')


def index(request):
    is_login = request.COOKIES.get('is_login')
    if is_login:
        username = request.COOKIES.get('username')
        return render(request, 'index.html', locals())
    else:
        return redirect('/login/')

此时views.py中就是当用户再login界面登陆后,系统会设置cookie将当前状态和登陆用户名记录下来然后响应给客户端,然后当用户访问index界面中,首先就去判断用户是否登陆,如果没有登陆那么就重定向到login页面中,如果登陆则跳出欢迎界面。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    <h3>这是主界面</h3>
    <p>hello,{{ username }}</p>
</body>
</html>

那么下图就是浏览器访问index所携带的cookie:
6

cookie源码

class HttpResponseBase:
    def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
                   domain=None, secure=False, httponly=False, samesite=None):
        """
        Set a cookie.

        ``expires`` can be:
        - a string in the correct format,
        - a naive ``datetime.datetime`` object in UTC,
        - an aware ``datetime.datetime`` object in any time zone.
        If it is a ``datetime.datetime`` object then calculate ``max_age``.
        """
        self.cookies[key] = value
        if expires is not None:
            if isinstance(expires, datetime.datetime):
                if timezone.is_aware(expires):
                    expires = timezone.make_naive(expires, timezone.utc)
                delta = expires - expires.utcnow()
                # Add one second so the date matches exactly (a fraction of
                # time gets lost between converting to a timedelta and
                # then the date string).
                delta = delta + datetime.timedelta(seconds=1)
                # Just set max_age - the max_age logic will set expires.
                expires = None
                max_age = max(0, delta.days * 86400 + delta.seconds)
            else:
                self.cookies[key]['expires'] = expires
        else:
            self.cookies[key]['expires'] = ''
        if max_age is not None:
            self.cookies[key]['max-age'] = max_age
            # IE requires expires, so set it if hasn't been already.
            if not expires:
                self.cookies[key]['expires'] = http_date(time.time() + max_age)
        if path is not None:
            self.cookies[key]['path'] = path
        if domain is not None:
            self.cookies[key]['domain'] = domain
        if secure:
            self.cookies[key]['secure'] = True
        if httponly:
            self.cookies[key]['httponly'] = True
        if samesite:
            if samesite.lower() not in ('lax', 'strict'):
                raise ValueError('samesite must be "lax" or "strict".')
            self.cookies[key]['samesite'] = samesite

那么通过这段源码我们可以看出来除了响应体设置cookie由key-value参数,还有一些其他的参数,例如超长时间max_age,cookie生效的路径path等。

cookie超长时间

有时候我们希望用户在登陆某网站一段时间后cookie就过期,那么我们就可以设置超长时间

views.py

from django.shortcuts import render,HttpResponse,redirect
from app01.models import UserInfo
# Create your views here.


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:
            response = HttpResponse('登陆成功')
            response.set_cookie('is_login', True, max_age=20)  # 超长时间
            response.set_cookie('username', user.user)
            return response

    return render(request, 'login.html')


def index(request):
    is_login = request.COOKIES.get('is_login')
    if is_login:
        username = request.COOKIES.get('username')
        return render(request, 'index.html', locals())
    else:
        return redirect('/login/')

那么当我们用户登陆login页面后,再去访问index界面,等待15秒钟后会自动重定向到login界面。

cookie超长时间

expires默认None ,cookie失效的实际日期/时间。

这个和max_age不一样的是这个要写时间的字符串

views.py

import datetime
date = datetime.datetime.strftime(year=2018, month=11, day=21, hour=3, minute=51, second=0)  # 东八区

response.set_cookie('is_login', True, expires=date)

那么这样写的意思就是在2018年11月22日 上午11时51分00秒这个cookie失效。可以自行去测试的,这个我就不演示了。

cookie生效路径

cookie生效的路径,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他应用。也就是说:如果我的index页面需要cookie,那么我就只需要在path后面设置为此页面就可以了,其余的并不需要。

views.py

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:
            response = HttpResponse('登陆成功')
            import datetime
            # date = datetime.datetime.strftime(year=2018, month=11, day=21, hour=3, minute=51, second=0)  # 东八区

            response.set_cookie('is_login', True, path='/login/')
            response.set_cookie('username', user.user)
            return response

    return render(request, 'login.html')

此时咱们设置的路径就是login页面,为了验证效果,当我们输入正确的信息后,当再次输入地址进入index界面中,因为cookie生效路径没有index,那么就会自动跳转到login页面了。

本次暂不演示。

删除cookie

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

session

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

为什么用session而不是cookie

session基于cookie实现的会话跟踪,cookie存放在客户端一旦丢失的话就会对用户的数据构成威胁。

我们来看一下cookie的保存:
7

当我们输入正确的账号和密码后,由服务器端响应体设置的cookie就会传给客户端,那么客户端再次请求的时候就会拿这个cookie去请求,因为是明文的、存放在浏览器的将变的十分不安全

那么让我们来看一下session怎么做的?

首先设置两条路由规则views.py:

path('login_session', views.login_session),
path('index_session', views.index_session),

同时设置视图函数views.py

# session
def login_session(request):
    return render(request, 'login.html')


def index_session(request):
    return render(request, 'index.html')

那么session是怎么和cookie不同的呢?

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

            return HttpResponse('登陆成功')
    return render(request, 'login.html')

当我们去浏览器访问下可以看到此时的sessionid:
8

在这里不同的是session和cookie创建的步骤不同:

  1. 首先服务器端会生成随机字符串123Dfdf
  2. 然后使用语句创建sessionid:request.set_cookid('sessionid','123dfdf)
  3. 最后在django_session表中创建一条记录:sessionid session_data

那么到最后返回到客户端的就是一个sessionid,当客户端浏览器再请求服务器时,服务器就会根据这个sessionid在djano_session表中查找这么一条记录,我们在创建数据库的时候django_session表已经自动创建好了。
9

那么此时咱们设置一个视图函数,看看session的数据是怎么找到的:

views.py

def index_session(request):
    print(request.session.get('is_login'))
    is_login = request.session.get('is_login')
    if not is_login:
        return redirect('/login_session/')

    username = request.session.get('username')

    return render(request, 'index.html', locals())

session去找数据也是三个步骤,首先要确认是不是第一次访问,如果是那么就添加词条记录,如果不是那就更新操作:

  1. 首先找到sessionid
  2. 通过sessionid去django_session表中找到这条记录
  3. 最后获取到session_data

session的其他方法

删除session值:del request.session['username']

views.py

def index_session(request):

    print(request.session.get('is_login'))
    del request.session['username']
    is_login = request.session.get('is_login')
    if not is_login:
        return redirect('/login_session/')

    # username = request.session.get('username')

    return render(request, 'index.html', locals())

那么此时咱们访问login_session后再访问index_session的时候,此时的username被我们删掉了,然后此时刷新界面是这样的:
10

flush():删除当前的会话数据并删除会话的Cookie。

logout.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    <h3>这是主界面</h3>
    <p>hello,{{ username }}</p>
    <a href="/logout/">注销</a>
</body>
</html>

views.py

def logout(request):
    request.session.flush()

    return redirect('/login_session/')

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    <h3>这是主界面</h3>
    <p>hello,{{ username }}</p>
    <a href="/logout/">注销</a>
</body>
</html>

此时点击注销标签,此时就会删除当前会话的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,默认修改之后才保存(默认)

基于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

            import datetime
            now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            request.session['time'] = now

            return HttpResponse('登陆成功')
    return render(request, 'login.html')

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    <h3>这是主界面</h3>
{#    <p>hello,{{ username }}</p>#}
    <p>上次登陆时间:{{ time }}</p>
    <a href="/logout/">注销</a>
</body>
</html>

基于cookie也是类似的做法。

--结束END--

本文标题: django会话跟踪技术

本文链接: https://www.lsjlt.com/news/180287.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • django会话跟踪技术
    目录 django中的会话跟踪技术 什么是会话跟踪技术 HTTP无状态协议 Cookie概述 什么是cookie ...
    99+
    2023-01-30
    技术 django
  • 会话跟踪技术Cookieless
    会话跟踪技术Cookieless...
    99+
    2023-06-04
  • 客户端会话跟踪技术 Cookie 浅谈
    文章目录 前言为什么之前浏览器和服务器不支持数据共享?会话跟踪技术Cookie的概念Cookie的工作流程Cookie的基本使用Cookie原理分析Cookie的存活时间Cookie存储中文 ...
    99+
    2023-08-31
    服务器 http 前端
  • web前端学习教程:Cookie会话跟踪技术
      1. Cookie会话跟踪技术介绍  会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,可以在客户端保存临时数据.  Cookie ...
    99+
    2023-06-05
  • Javaweb会话跟踪技术Cookie和Session的具体使用
    目录前言一.会话引入二.Cookie1.Cookie的理解2.Cookie生命周期3.Cookie有效路径4.Cookie使用细节三.Session1.Session基本原理2.Se...
    99+
    2024-04-02
  • 使用dbms_monitor.session_trace_enable跟踪一个会话
    一 . 10046事件的 4个级别 10046 事件按照收集信息内容,可以分成4个级别: Level 1: 等同于SQL_TRACE 的功能 Leve...
    99+
    2024-04-02
  • PHP(14)会话技术
    PHP(14)会话技术 一、概念二、分类三、cookie技术1. cookie的基本使用2. cookie的生命周期3. cookie的作用范围4. cookie的跨子域5. cookie的数...
    99+
    2023-09-17
    php 服务器 开发语言
  • JavaWeb会话技术怎么用
    小编给大家分享一下JavaWeb会话技术怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.什么是会话:2.会话技术有哪些:什么是Cookie?Cookie,...
    99+
    2023-06-25
  • Javacookie和session会话技术介绍
    目录一、cookie1、cookie的概念2、cookie的创建3、获取cookie4、修改cookie5、设置cookie的有效时间6、设置cookie的有效路径二、session...
    99+
    2023-05-14
    Java cookie会话技术 Java session会话技术 Java cookie session
  • 数据库中如何使用dbms_monitor跟踪多个会话,service_name,sid等
    这篇文章主要为大家展示了“数据库中如何使用dbms_monitor跟踪多个会话,service_name,sid等”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“...
    99+
    2024-04-02
  • JavaWeb会话技术详解与案例
    1.什么是会话: 2.会话技术有哪些: 什么是Cookie? Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Sessi...
    99+
    2024-04-02
  • JavaWeb之会话技术案例详解
    会话技术     1. 会话:一次会话中包含多次请求和响应。          &...
    99+
    2024-04-02
  • JavaWeb之会话技术的示例分析
    这篇文章给大家分享的是有关JavaWeb之会话技术的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。会话技术    1. 会话:一次会话中包含多次请求和响应...
    99+
    2023-06-20
  • WEB核心【会话技术】第十五章
    目录 💂 个人主页: 爱吃豆的土豆🤟 版权: 本文由【爱吃豆的土豆】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 ...
    99+
    2023-09-20
    java 服务器 前端
  • 如何解析嵌入式Linux Kernel错误跟踪技术
    这篇文章将为大家详细讲解有关如何解析嵌入式Linux Kernel错误跟踪技术,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。随着嵌入式Linux系统的广泛应用,对系统的可靠性提出了更高的要求...
    99+
    2023-06-16
  • 在oracle中跟踪会话执行语句的几种方法分别是什么
    这期内容当中小编将会给大家带来有关在oracle中跟踪会话执行语句的几种方法分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。生成sql trace可以有以下几种方式:参数设置:非常传统的方法。系统...
    99+
    2023-06-06
  • Java Web会话技术Session的简单使用
    目录什么是SessionSession如何工作结合代码理解Session什么是Session Session技术是将信息保存在服务端,而客户端需要接收、记录和回送Session的ID...
    99+
    2024-04-02
  • Java cookie和session会话技术怎么使用
    这篇文章主要介绍“Java cookie和session会话技术怎么使用”,在日常操作中,相信很多人在Java cookie和session会话技术怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希...
    99+
    2023-07-05
  • 如何使用动态跟踪技术SystemTap监控MySQL、Oracle性能
    这篇文章主要介绍如何使用动态跟踪技术SystemTap监控MySQL、Oracle性能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!这次的中国数据库技术大会有很多关键词,例如源码、开...
    99+
    2024-04-02
  • JavaSession会话追踪原理深入分析
    目录一、会话技术二、Session1.原理2.特点3.获得一个会话对象4.Session常见方法三、Cookie和Session的区别一、会话技术 客户端和服务器通信的过程中,自然而...
    99+
    2022-11-13
    Java Session会话追踪 Java中的Session
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作