059.Python前端Django组件cooki和session
一 会话跟踪技术
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的更多相关文章
- 061.Python前端Django组件用户认证组件
一 auth认证组件 在使用pymysql,数据库迁移的时候.,默认生成有十张表如下 查看author_user表结构 mysql> desc auth_user; +------------- ...
- Django组件 - cookie、session、用户认证组件
一.cookie 1.会话跟踪技术 1)什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话 ...
- 052.Python前端Django框架路由层和视图层
一.路由层(URLconf) 1.1 路由层简单配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Dj ...
- Django组件-cookie与session
一.会话跟踪技术 1.什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...
- web框架开发-Django组件cookie与session
http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...
- 9.Django组件-cookie和session
HTTP协议的无保存状态,对两次请求没有任何关联.每次请求都是相互独立的. 1.cookie简介 什么是会话跟踪技术我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会 ...
- Django 组件-cookie与session
Cookie概述 什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中 ...
- Django 组件-cookie 与 session
会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...
- Django组件——cookie与session
一.会话跟踪技术 1.什么是会话跟踪技术 可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应. 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直 ...
随机推荐
- 剑指offer--孩子们的游戏(圆圈中最后剩下的数字)
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m ...
- MySQL数据库高级一:架构介绍
两天半就可以 严禁使用 精通 在简历上 了解的越多,越比他人有优势 linux的mysql需要使用中文字符集那么就要修改配置文件 1.mysql的linux版 安装和卸载不说了 2.逻辑架构 总体概况 ...
- JetBrains系列IDE无法输入中文
1 问题描述 环境Linux+fcitx,JetBrains的IDE无法输入中文,包括IDEA,PyCharm,WebStorm,CLion等等. 2 解决方案 Linux下一般使用fcitx进入中文 ...
- Go-22-方法
方法 Go语言同时有函数和方法,方法的本质是函数,但是方法和函数又有所不同. 函数(function)是一段具有独立功能的代码,可以被反复多次调用,从而实现代码复用. 方法(method)是一个类的行 ...
- Redis持久化——AOF日志
最新:Redis内存--内存消耗(内存都去哪了?) 最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 更多文章... 上一篇文章Redis持久化--内存快照(R ...
- 工厂模式之简单工厂模式,head first设计模式
简单设计模式比较简单,15分钟的时间,跟着我做,十几分钟学会简单设计模式,开始吧: 1.使用new实例化一个对象时,你肯定知道这种代码缺少弹性,绑定着具体的类会导致代码更加脆弱,简单工厂模式就是针对接 ...
- Java集合原理分析和知识点大杂烩(多图初学者必备!!)
一.数据结构 数据结构就是计算机存储.组织数据的方式. 在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用O符号来表述. 时间复杂度是同一问题可用不同算法解决, ...
- 记一次 .NET 某教育系统API 异常崩溃分析
一:背景 1. 讲故事 这篇文章起源于 搬砖队大佬 的精彩文章 WinDBg定位asp.net mvc项目异常崩溃源码位置 ,写的非常好,不过美中不足的是通览全文之后,总觉得有那么一点不过瘾,就是没有 ...
- 1025 PAT Ranking
Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...
- 病毒木马查杀实战第021篇:Ring3层主动防御之编程实现
前言 我们这次会依据上次的内容,编程实现一个Ring3层的简单的主动防御软件.整个程序使用MFC实现,程序开始监控时,会将DLL程序注入到explorer.exe进程中,这样每当有新的进程创建,程序首 ...