一 会话跟踪技术

1.1 什么是会话

会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程。

1.2 什么是会话跟踪

对同一个用户对服务器的连续的请求和接受响应的监视。(将用户与同一用户发出的不同请求之间关联,为了数据共享)

1.3 为什么需要会话跟踪

浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才应会话跟踪技术来实现这种要求

在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下: 请求银行主页;

  • 请求登录(请求参数是用户名和密码);
  • 请求转账(请求参数与转账相关的数据);
  • 请求信用卡还款(请求参数与还款相关的数据)。

1.4 会话路径技术使用Cookie或session完成

我们知道HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪!在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术。

Cookie是可以被禁止的。

二 COOKIE的使用

2.1 Cookie规范

  • Cookie大小上限为4KB;
  • 一个服务器最多在客户端浏览器上保存20个Cookie;
  • 一个浏览器最多保存300个Cookie;

2.2 Cookie与HTTP头

Cookie是通过HTTP请求和响应头在客户端和服务器端传递的:

  • Cookie:请求头,客户端发送给服务器端;
  • 格式:Cookie: a=A; b=B; c=C。即多个Cookie用分号离开;  Set-Cookie:响应头,服务器端发送给客户端;
  • 一个Cookie对象一个Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C

2.3 Cookie的覆盖

如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

django中的cookie语法

2.4 使用Cookie

创建一个数据库

mysql> create database cookie_test default charset=utf8;

mysql> use cookie_test;

新建一个项目

root@darren-virtual-machine:~/PycharmProjects# django-admin startproject cookie_seesion

root@darren-virtual-machine:~/PycharmProjects# cd cookie_seesion

root@darren-virtual-machine:~/PycharmProjects/cookie_seesion# python3 manage.py startapp cookie

root@darren-virtual-machine:~/PycharmProjects/cookie_seesion# vim cookie_seesion/settings.py

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cookie.apps.CookieConfig'
]

配置数据库

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cookie_test',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD':'123456',
}
}

只想数据库迁移操作

root@darren-virtual-machine:~/PycharmProjects/cookie_seesion# python3 manage.py makemigrations

root@darren-virtual-machine:~/PycharmProjects/cookie_seesion# python3 manage.py migrate

Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK

查看数据库

mysql> show tables;

配置路由分发

from django.contrib import admin
from django.urls import path,include urlpatterns = [
path('admin/', admin.site.urls),
path("cookie/",include("cookie.urls"))
]

cookie/urls

from django.urls import  path,re_path
from cookie import views
urlpatterns = [
path("index/",views.index),
path("login/",views.login),
]

当url文件把[] 写成{}时,会有如下错误

views视图文件

from django.shortcuts import render,redirect

# Create your views here.
def index(request):
return render(request,"index.html")
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "joy" and password == "123456":
return redirect("/cookie/index/")
else:
return redirect("/cookie/login/")

模板文件

root@darren-virtual-machine:~/PycharmProjects/cookie_seesion# mkdir templates

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,"templates")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>index 页面。。。</h3> </body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>用户登录</h3>
<form action="" method="POST">
{% csrf_token %}
<p>用户名:<input type="text" name="username"></p>
<p>密 码:<input type="password" name="password"></p>
<input type="submit">
</form> </body>
</html>

访问http://127.0.0.1:8000/cookie/index/

访问http://127.0.0.1:8000/cookie/login并登陆

会得到index页面

但是这样的话,直接访问http://127.0.0.1:8000/cookie/index/也会得到index.html页面

添加一个cookie

from django.shortcuts import render,redirect

# Create your views here.
def index(request):
return render(request,"index.html")
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "joy" and password == "123456":
rep = redirect("/cookie/index/")
rep.set_cookie("is_login",True)
return rep
else:
return redirect("/cookie/login/")

直接访问

登录访问

携带有is_login的cookie

做登陆限制

from django.shortcuts import render,redirect

# Create your views here.
def index(request):
if not request.COOKIES.get("is_login"):
return redirect("/cookie/login/")
return render(request,"index.html")
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "joy" and password == "123456":
rep = redirect("/cookie/index/")
rep.set_cookie("is_login",True)
return rep
else:
return redirect("/cookie/login/")

这样cookie保存在本地,也可以直接访问

cookie注销页面

from django.urls import  path,re_path
from cookie import views
urlpatterns = [
path("index/",views.index),
path("login/",views.login),
path('loginout/',views.loginout),
]

views页面

from django.shortcuts import render,redirect

# Create your views here.
def index(request):
if not request.COOKIES.get("is_login"):
return redirect("/cookie/login/")
return render(request,"index.html")
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "joy" and password == "123456":
rep = redirect("/cookie/index/")
rep.set_cookie("is_login",True)
return rep
else:
return redirect("/cookie/login/")
def loginout(request):
rep = redirect("/cookie/login/")
rep.delete_cookie("is_login")
return rep

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>index 页面。。。</h3>
<a href="/cookie/loginout/">注销</a>
</body>
</html>

点击注销

再次直接访问index,就不能得到index页面

添加一个订单页面

from django.urls import  path,re_path
from cookie import views
urlpatterns = [
path("index/",views.index),
path("login/",views.login),
path('loginout/',views.loginout),
path('order/',views.order),
]

view页面

from django.shortcuts import render,redirect,HttpResponse

# Create your views here.
def index(request):
if not request.COOKIES.get("is_login"):
return redirect("/cookie/login/")
return render(request,"index.html")
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "joy" and password == "123456":
rep = redirect("/cookie/index/")
rep.set_cookie("is_login",True)
return rep
else:
return redirect("/cookie/login/")
def loginout(request):
rep = redirect("/cookie/login/")
rep.delete_cookie("is_login")
return rep
def order(request):
if not request.COOKIES.get("is_login"):
return redirect("/cookie/login/")
return HttpResponse("oreder success")

使用装饰器进行改进

from django.shortcuts import render,redirect,HttpResponse

# Create your views here.
#装饰器

def login_required(func):
def inner(request,*args,**kwargs):
if not request.COOKIES.get("is_login"):
return redirect("/cookie/login/")
rep = func(request,*args,**kwargs)
return rep
return inner @login_required
def index(request):
# if not request.COOKIES.get("is_login"):
# return redirect("/cookie/login/")
return render(request,"index.html")
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "joy" and password == "123456":
rep = redirect("/cookie/index/")
rep.set_cookie("is_login",True)
return rep
else:
return redirect("/cookie/login/")
def loginout(request):
rep = redirect("/cookie/login/")
rep.delete_cookie("is_login")
return rep @login_required
def order(request):
# if not request.COOKIES.get("is_login"):
# return redirect("/cookie/login/")
return HttpResponse("oreder success")

三 Seesion的使用

3.1 session简介

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

django初始化数据库的时候,会有一个django_session的表

3.2 session和浏览器

1.浏览器向服务器发送请求时,第一次的cookie是空的,如果在视图里配置request.session["username"]="joy",则会

生成一个session_key的随机字符串,相当于一把钥匙,

2.会把request的键值对存到session-data里面

3.把随机生成的seesion_key设成一个cookie。seesionid=session_key这样的形式,挡浏览器第二次请求的时候,就会携带这个session_id作为cookie

3.3 django中session语法

1、设置Sessions值
request.session['session_name'] ="admin"
2、获取Sessions值
session_name = request.session["session_name"]
3、删除Sessions值
del request.session["session_name"]
4、flush()
删除当前的会话数据并删除会话的Cookie。
这用于确保前面的会话数据不可以再次被用户的浏览器访问
5、get(key, default=None)
fav_color = request.session.get('fav_color', 'red')
6、pop(key)
fav_color = request.session.pop('fav_color')
7、keys()
8、items()
9、setdefault()
10 用户session的随机字符串
request.session.session_key # 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key") # 删除当前用户的所有Session数据
request.session.delete("session_key") request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

3.4 通过seedion实现一个用户登录管理

创建一个session 的app

root@darren-virtual-machine:~/PycharmProjects/cookie_seesion# python3 manage.py startapp session

注册app

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cookie.apps.CookieConfig',
'session.apps.SessionConfig',
]

urls配置路由分发

from django.contrib import admin
from django.urls import path,include urlpatterns = [
path('admin/', admin.site.urls),
path("cookie/",include("cookie.urls")),
path("session/",include("session.urls")),
]

url文件

from django.urls import  path,re_path
from session import views
urlpatterns = [
path("index/",views.index),
path('login/',views.login),
]

view文件

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def index(request):
if not request.session.get("is_login"):
      #1. 从cookie中取出sessionid  
      #2. 拿到随机字符串到django_session 表中过滤对象
      #3. 拿到对象取出data值。
return redirect("/session/login/")
return render(request,"session_index.html")
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "joy" and password == "123456":
request.session["is_login"] = True
      #1. 生产随机字符串
      #2. 将数据存到django_session表中
      #3. 设置cookie值。(sessionid,值为随机字符串)
return redirect("/session/index/")
else:
return redirect("/cookie/login/")

访问http://127.0.0.1:8000/session/index,会直接返回http://127.0.0.1:8000/session/login/

登录得到cookie值

查看数据库

mysql> select * from django_session;

默认过期时间是两周

注销登录,清除seedion值

from django.urls import  path,re_path
from session import views
urlpatterns = [
path("index/",views.index),
path('login/',views.login),
path('logout/',views.logout),
]

views文件

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def index(request):
if not request.session.get("is_login"):
return redirect("/session/login/")
return render(request,"session_index.html")
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "joy" and password == "123456":
request.session["is_login"] = True
return redirect("/session/index/")
else:
return redirect("/cookie/login/")
def logout(request):
request.session.flush()
"""
1. 从cookie中取出sessionid
2. 拿到随机字符串到django_session 表中过滤对象
3. 删除该对象。
"""
return redirect("/session/login/")

seesiin_index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>session index 页面。。。</h3>
<a href="/session/logout">注销</a>
</body>
</html>

注销后,查看数据库信息,session被清空

查看数据库

3.5 session保存的是浏览器的信息验证

实例验证

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def index(request):
if not request.session.get("is_login"):
return redirect("/session/login/")
return render(request,"session_index.html")
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username in ["joy","john"] and password == "123456":
request.session["is_login"] = True
return redirect("/session/index/")
else:
return redirect("/cookie/login/")
def logout(request):
request.session.flush()
"""
1. 从cookie中取出sessionid
2. 拿到随机字符串到django_session 表中过滤对象
3. 删除该对象。
"""
return redirect("/session/login/")

在同一个浏览器,登录joy账号

数据库信息

在同一个浏览器,打开另一个窗口,登录john账号

查看数据库

并没有变化,同样的操作,但是当使用无痕浏览器登录john账号,

结果如下

数据库,不同的浏览器,session不一样

059.Python前端Django组件cooki和session的更多相关文章

  1. 061.Python前端Django组件用户认证组件

    一 auth认证组件 在使用pymysql,数据库迁移的时候.,默认生成有十张表如下 查看author_user表结构 mysql> desc auth_user; +------------- ...

  2. Django组件 - cookie、session、用户认证组件

    一.cookie 1.会话跟踪技术 1)什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话 ...

  3. 052.Python前端Django框架路由层和视图层

    一.路由层(URLconf) 1.1 路由层简单配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Dj ...

  4. Django组件-cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...

  5. web框架开发-Django组件cookie与session

    http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...

  6. 9.Django组件-cookie和session

    HTTP协议的无保存状态,对两次请求没有任何关联.每次请求都是相互独立的. 1.cookie简介 什么是会话跟踪技术我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会 ...

  7. Django 组件-cookie与session

    Cookie概述 什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中 ...

  8. Django 组件-cookie 与 session

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  9. Django组件——cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应. 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直 ...

随机推荐

  1. 剑指offer--孩子们的游戏(圆圈中最后剩下的数字)

    每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m ...

  2. MySQL数据库高级一:架构介绍

    两天半就可以 严禁使用 精通 在简历上 了解的越多,越比他人有优势 linux的mysql需要使用中文字符集那么就要修改配置文件 1.mysql的linux版 安装和卸载不说了 2.逻辑架构 总体概况 ...

  3. JetBrains系列IDE无法输入中文

    1 问题描述 环境Linux+fcitx,JetBrains的IDE无法输入中文,包括IDEA,PyCharm,WebStorm,CLion等等. 2 解决方案 Linux下一般使用fcitx进入中文 ...

  4. Go-22-方法

    方法 Go语言同时有函数和方法,方法的本质是函数,但是方法和函数又有所不同. 函数(function)是一段具有独立功能的代码,可以被反复多次调用,从而实现代码复用. 方法(method)是一个类的行 ...

  5. Redis持久化——AOF日志

    最新:Redis内存--内存消耗(内存都去哪了?) 最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 更多文章... 上一篇文章Redis持久化--内存快照(R ...

  6. 工厂模式之简单工厂模式,head first设计模式

    简单设计模式比较简单,15分钟的时间,跟着我做,十几分钟学会简单设计模式,开始吧: 1.使用new实例化一个对象时,你肯定知道这种代码缺少弹性,绑定着具体的类会导致代码更加脆弱,简单工厂模式就是针对接 ...

  7. Java集合原理分析和知识点大杂烩(多图初学者必备!!)

    一.数据结构 ​ 数据结构就是计算机存储.组织数据的方式. ​ 在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用O符号来表述. ​ 时间复杂度是同一问题可用不同算法解决, ...

  8. 记一次 .NET 某教育系统API 异常崩溃分析

    一:背景 1. 讲故事 这篇文章起源于 搬砖队大佬 的精彩文章 WinDBg定位asp.net mvc项目异常崩溃源码位置 ,写的非常好,不过美中不足的是通览全文之后,总觉得有那么一点不过瘾,就是没有 ...

  9. 1025 PAT Ranking

    Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...

  10. 病毒木马查杀实战第021篇:Ring3层主动防御之编程实现

    前言 我们这次会依据上次的内容,编程实现一个Ring3层的简单的主动防御软件.整个程序使用MFC实现,程序开始监控时,会将DLL程序注入到explorer.exe进程中,这样每当有新的进程创建,程序首 ...