培训网站制作网站,徐州做网站沈阳厂商,网站怎么备案在哪里下载,做网站源码需要多少钱目录
一.Cookie与Session的发展史
1.Cookie的发展史
2.Session的发展史
3.Cookie和Session的关系
4.总结
二.Cookie与Session详解
1.Cookie
2.Session
3.token
4.总结
三.Django操作Cookie
1.设置Cookie
2.获取Cookie
3.设置超时时间
4.注销Cookie
5.登录功能实…目录
一.Cookie与Session的发展史
1.Cookie的发展史
2.Session的发展史
3.Cookie和Session的关系
4.总结
二.Cookie与Session详解
1.Cookie
2.Session
3.token
4.总结
三.Django操作Cookie
1.设置Cookie
2.获取Cookie
3.设置超时时间
4.注销Cookie
5.登录功能实现
1.0简单实现
2.0解决登录问题
3.0迭代-登录认证装饰器
四.Django操作Session
1.设置Session
2.获取Session
3.设置/获取Session多个值
4.django_session表中的session数据
5.设置过期时间
6.清空session
1request.session.delete():
2request.session.flush():
7.保存
原理剖析
案例演示
1.0简单的
2.0解决方法
3.0优化 一.Cookie与Session的发展史 Cookie和Session是用来在Web应用程序中跟踪用户会话数据的两种常用技术 1.Cookie的发展史
1994年网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件用于跟踪用户在网站上的活动。初始版本的Cookie只能存储很少的数据并且没有强制加密机制容易被恶意用户篡改或窃取。因此随着互联网的快速发展Cookie引起了一系列安全和隐私问题。
2.Session的发展史
由于Cookie存在的局限性Web开发人员开始寻找更安全、可靠的替代方案。1997年Sun Microsystems提出了基于服务器的会话管理方案即Session。Session是在服务器端存储用户会话数据的一种技术。每当用户访问网站时服务器会为其创建一个唯一的Session标识符Session ID并将会话数据存储在服务器上。Session ID一般通过Cookie或URL参数传递给客户端用于识别用户的会话状态。
3.Cookie和Session的关系
在实际应用中Cookie和Session通常结合使用。当用户首次访问网站时服务器会为其分配一个唯一的Session ID并将其存储在Cookie中发送给客户端保存。随后客户端在每次请求中都会携带该Cookie服务器通过解析Cookie中的Session ID读取对应的会话数据实现用户状态的跟踪和管理。
4.总结 Cookie和Session是Web应用程序中常用的用户会话跟踪技术 Cookie通过在客户端存储小型文本文件并将会话标识符传递给服务器实现会话状态的保持 Session则是在服务器端存储会话数据通过Session ID实现对用户会话的追踪 他们的发展历程与互联网的发展紧密相关为开发人员提供了更多的选择以保障安全性和用户体验的提升 二.Cookie与Session详解 以登录功能为例 如果不保存用户登录状态也就意味着用户每次访问网站都需要重复的输入用户名和密码 这对用户来说体验极差 解决方法 当用户第一次登录成功之后将用户的用户名和密码返回给浏览器让用户浏览器保存在本地 之后访问网站的时候浏览器自动将保存在本地的用户名和密码发送给服务端服务端获取之后自动验证但是具有极大的安全隐患 优化 当用户登录成功之后服务端产生一个随机字符串在服务端保存数据用K:V键值对的形式交由客户端浏览器保存 之后访问服务端时都带着随机字符串服务端去数据库中比对是否有匹配到的随机字符串从而获得用户信息 但是如果截取到当前随机字符串那么就可以冒充当前用户其实还是有极大的安全隐患 在web领域没有绝对的安全和绝对的不安全 1.Cookie
服务器保存在客户端浏览器上的信息都可以称之为cookie它的表现形式一般都是K:V键值对可以有多个
2.Session
保存在服务器上的信息都可以称之为session它的表现形式一般都是K:V键值对可以有多个
3.token
session虽然数据是保存在服务端的但是挡不住数据量大解决办法服务端不再保存数据 登录成功之后将一段信息加密处理用自己独特的加密方式进行加密将加密之后的结果拼接在信息后面整体返回给浏览器保存浏览器下次访问的时候带着该信息服务端自动切取前面的一段信息再次使用自己的加密算法进行加密然后用这段密文与携带过来的密文进行比对
4.总结
cookie就是保存在客户端浏览器上的信息session就算保存在服务端上的信息session是基于cookie工作的其实大部分的保存用户状态的操作都需要使用cookie
三.Django操作Cookie 虽然Cookie是服务端告诉客户端浏览器需要保存内容但是客户端浏览器可以选择拒绝保存如果禁止自动保存Cookie那么只要是需要登录的网站都没办法正常登录了 视图函数的返回值
return HttpResponse()
return render()
return redirect()变形
obj HttpResponse()
return objobj1 render()
return obj1obj2 redirect()
return obj2如果想要操作Cookie必须进行以上变形才可以 1.设置Cookie
obj HttpResponse()
obj.set_cookie(key,value)
return obj2.获取Cookie
request.COOKIES.get(key)3.设置超时时间
obj HttpResponse()
obj.set_cookie(key,value,max_age5)
# 设置超时时间 5s 到期
return objmax_age 设置超时时间以秒为单位expiress 设置超时时间针对IE浏览器使用以秒为单位
4.注销Cookie
obj HttpResponse()
# 设置超时时间 5s 到期
obj.delete_cookie(key)
return obj5.登录功能实现
1.0简单实现
路由
urlpatterns [path(admin/, admin.site.urls),path(login/, views.login),path(home/, views.home),
]视图
def login(request):if request.method POST:username request.POST.get(username)password request.POST.get(password)if username dream and password 521:# 登陆成功之后跳转到登陆成功之后才能看到的页面return redirect(/home/)return render(request, login.html)def home(request):return HttpResponse(登陆成功)前端
form action methodpostpusername:input typetext nameusername classform-control/pppassword:input typepassword namepassword classform-control/pinput typesubmit classbtn btn-success
/form问题登录成功之后的跳转页面不需要登录也可以直接访问到只需要给对应的地址即可 2.0解决登录问题
from django.shortcuts import render, HttpResponse, redirect# Create your views here.
def login(request):if request.method POST:username request.POST.get(username)password request.POST.get(password)if username dream and password 521:# 登陆成功之后保存用户登陆状态obj redirect(/home/)# 让浏览器记录cookieobj.set_cookie(sign, 1314521)浏览器不单单只是帮我们保存cookie而且在后面每次访问的时候都会带着cookie# 登陆成功之后跳转到登陆成功之后才能看到的页面return objreturn render(request, login.html)def home(request):# 读取携带的cookiecookie正确登陆成功if request.COOKIES.get(sign) 1314521:return HttpResponse(登陆成功)# 读取携带的cookiecookie不正确跳转到登陆页面return redirect(/login/)
3.0迭代-登录认证装饰器 用户如果没有登录的情况下想访问一个需要登录的页面那么先跳转到登录页面当用户输入正确的用户名和密码之后再跳转到用户之前想访问的页面去而不是直接写死 from django.shortcuts import render, HttpResponse, redirect# Create your views here.
def login(request):if request.method POST:username request.POST.get(username)password request.POST.get(password)if username dream and password 521:# 获取用户上一次想要访问的url# 结果可能为空 -- 直接访问logintag_url request.GET.get(tag_url)if tag_url:obj redirect(tag_url)else:# 登陆成功之后保存用户登陆状态obj redirect(/home/)# 让浏览器记录cookieobj.set_cookie(sign, 1314521)浏览器不单单只是帮我们保存cookie而且在后面每次访问的时候都会带着cookie# 登陆成功之后跳转到登陆成功之后才能看到的页面return objreturn render(request, login.html)# 校验用户登录状态的装饰器
def auth_check(func):def inner(request, *args, **kwargs):# 获取到用户上一次想要访问的urltag_url request.get_full_path()# 读取携带的cookiecookie正确登陆成功if request.COOKIES.get(sign) 1314521:res func(request, *args, **kwargs)return reselse:# 读取携带的cookiecookie不正确跳转到登陆页面return redirect(f/login/?next{tag_url})return innerauth_check
def home(request):return HttpResponse(home登陆成功)auth_check
def index(request):return HttpResponse(index登陆成功)auth_check
def func(request):return HttpResponse(func登陆成功)四.Django操作Session Session数据是保存在服务端的给客户端返回的是一个随机字符串 1.设置Session
request.session[key] value2.获取Session
request.session.get(key)3.设置/获取Session多个值
给session设置多个值的时候存在数据库中的数据仍是一条但是在取session的时候可以通过request.session对象获取到设置的多组键值对
4.django_session表中的session数据 django_session表中的数据条取决于浏览器 同一个计算器IP地址上同一个浏览器只会有一条数据失效同一个计算器IP地址上多个浏览器会有多个数据生效当session过期的时候可能会出现多条数据对应一个浏览器 但是这些数据不会持久化存储会被定时清理掉可以手动清除也可以代码清除目的是为了节省服务器数据库资源 5.设置过期时间
# 设置session
request.session[key] value
# 设置过期时间
request.session.set_expiry()
参数 整数 多少秒过期日期对象 到指定日期失效0 一旦退出当前浏览器窗口就失效不写 失效时间取决于Django内部全局session失效的时间
6.清空session
1request.session.delete(): 只删除服务端的 该方法用于删除当前用户的Session数据但是会保留Session的Key这意味着Session对象本身仍然存在但其中的数据将被清空下次访问时如果Session没有被重新填充则会得到一个空的Session对象 def clear_session(request):request.session.delete()# 其他操作或返回响应2request.session.flush(): 服务端和客户端都删除 该方法用于完全删除当前用户的Session包括Session对象的所有相关数据下次访问时将创建一个新的空Session对象 def clear_session(request):request.session.flush()# 其他操作或返回响应7.保存
1. 数据库Session
SESSION_ENGINE django.contrib.sessions.backends.db # 引擎默认2. 缓存Session
SESSION_ENGINE django.contrib.sessions.backends.cache # 引擎
SESSION_CACHE_ALIAS default # 使用的缓存别名默认内存缓存也可以是memcache此处别名依赖缓存的设置3. 文件Session
SESSION_ENGINE django.contrib.sessions.backends.file # 引擎
SESSION_FILE_PATH None # 缓存文件路径如果为None则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存数据库
SESSION_ENGINE django.contrib.sessions.backends.cached_db # 引擎5. 加密Cookie Session
SESSION_ENGINE django.contrib.sessions.backends.signed_cookies # 引擎其他公用设置项
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默认修改之后才保存默认原理剖析
*request*.session[sign] 369内部发生了哪些事 Django内部会自动帮我们生成一个随机字符串Django自动将随机字符串和对应的数据存储到django_session表中 先在内存中产生操作数据的内存在响应经过Django中间件的时候才去操作数据库将产生的随机字符串返回给客户端浏览器保存request.session.get(sign)内部发生了哪些事 自动从浏览器中获取sessionid对应的随机字符串根据该随机字符串去django_session表中查找对应的数据 如果匹配成功则将对应的数据取出并以字典的形式封装到request.session中如果匹配不成功则request.session中的数据为None
案例演示
1.0简单的
路由
# session操作
path(set_session/, views.set_session),视图
def set_session(request):request.session[sign] 369return HttpResponse(返回消息)会报错
OperationalError at /set_session/
no such table: django_session数据是保存在服务端的 在默认情况下操作session的时候需要Django默认的一张django_session表数据库迁移命令时 Django会默认创建很多表其中就有Django_session表Django默认session的过期时间是14天 但是我们可以人为的修改过期时间 2.0解决方法
先进行数据库迁移命令 再进行访问session会自动保存到django_session表中
3.0优化
路由
# session操作
path(set_session/, views.set_session),
path(get_session/, views.get_session),视图
def set_session(request):request.session[sign] 369return HttpResponse(返回消息)def get_session(request):request.session.get(sign)return HttpResponse(拿取成功消息)