day 71-72 cookie 和session
拓展知识 request---->请求信息
属性:
request.path # 获取访问文件路径
request.method属性 #获取请求中使用的HTTP方式(POST/GET)
request.body #含所有请求体信息 是bytes类型
request.GET             #GET请求的数据(类字典对象) 请求头中的url中?后面拿值
request.POST             # POST请求的数据(类字典对象) 请求体里拿值
request.COOKIES #包含所有cookies的标准Python字典对象;keys和values都是字符串。
request.FILES:                包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file"
name="" />标签中
                 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包
含下面三个Keys:
     filename:      上传文件名,用字符串表示
                 content_type:   上传文件的Content Type
                 content:       上传文件的原始内容
请求url:http://127.0.0.1:8000/index.html/23?a=1
request.path : 请求路径    8000 以后的没有get请求   
       request.path结果为:/index.html/23
request.get_full_path()    8000 以后的包含get请求
       request.get_full_path()结果为:/index.html/23?a=1
cookie 的理论
rep.set_cookie("k1", "v1", max_age=10) # 这里是设置cookie
rep.cookie.get('k1',None) # 这里是获取cookie
* default:默认值
* salt:加盐
* max_age:后台控制过期时间
- expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
- path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
- domain=None, Cookie生效的域名
- secure=False, https传输
- httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
from django.shortcuts import render,redirect # Create your views here.
#
# def login(request):
# if request.method == 'POST':
# user1 = request.POST.get('user')
# pwd1 = request.POST.get('pwd')
# if user1 == 'alex' and pwd1 == '123':
# rep = redirect('/index1/')
# # # 第一个uesrname设置cookie是个k 设置一个cookie 没有实际意义
# # rep.set_cookie('user2', user1)
# # # 第二个加盐设置/ 后边就上一个salt 位置不能改变
# # rep.set_signed_cookie('pwd2',pwd1,salt='s8')
# # # 第三种个加盐设置 并且限制拿到cookie 的时间 后边单位是秒 进入index.html 的时间是10s
# # # 超过10秒后会自动退出到login中
# rep.set_signed_cookie('pwd2',pwd1,salt='s8',max_age=120)
# # # 第四种 path='/index1/'只能是index1 才能有cooki,不设置这个 都会有在10秒之内
# # # rep.set_signed_cookie('pwd2', pwd1, salt='s8', max_age=10,path='/index1/')
# return rep
# return render(request, 'longin.html')
# # @wrapper
# def index1(request):
# # # 第一种拿到上面设置的cookie 的名字
# # # username = request.COOKIES.get('user2')
# # # 第二种拿到上面设置的cookie 的名字
# # username = request.get_signed_cookie('pwd2', salt='s8')
# # # 要是为空自动返回login
# # username = request.get_signed_cookie('pwd2', None, salt='s8')
# # if not username:
# # return redirect('/login/')', {'uesrw': username}
# return render(request, 'index1.html')
# 在页面上能显示的密码是123 但是在源代码中的回应体中显示加盐的效果就能显示
# #
# def index2(request):
# # 第一种拿到上面设置的cookie 的名字
# # username = request.COOKIES.get('user2')
# # 第二种拿到上面设置的cookie 的名字
# # username = request.get_signed_cookie('pwd2',salt='s8')
# # 要是为空自动返回login
# username = request.get_signed_cookie('pwd2', None, salt='s8')
# if not username:
# return redirect('/login/')
# return render(request, 'index2.html', {'uesrw': username}) # 运用装饰器函数的方法 减少代码的重复 # 装饰器函数的应用 return func() 要装饰的函数(关键点)
# def login(request):
# if request.method == 'POST':
# user1 = request.POST.get('user')
# pwd1 = request.POST.get('pwd')
# if user1 == 'alex' and pwd1 == '123':
# rep = redirect('/home/')
# rep.set_signed_cookie('pwd2', pwd1, salt='s8', max_age=10) #加上path 就只能index访问
# return rep
# return render(request, 'longin.html') # def wrapper(func):
# def inner(request,*args,**kwargs):
# # 装饰器之前要做的
# user = request.get_signed_cookie('pwd2', None, salt='s8')
# if not user:
#
# return redirect('/login/')
# else:
# return func(request, *args, **kwargs)
# return inner
# @wrapper
# def home(request):
# user = request.get_signed_cookie('pwd2', salt='s8')
# return render(request,'home.html',{'username':user}) # -----------------------------------------------------------------------
# request.path : 请求路径 8000 以后的没有get请求
# request.path结果为:/index.html/23
#
# request.get_full_path() 8000 以后的包含get请求
# request.get_full_path()结果为:/index.html/23?a=1
def login(request):
if request.method == 'POST':
user1 = request.POST.get('user')
pwd1 = request.POST.get('pwd') # /home/可以不用写 意思就是只要/?next= xxx 就会还是跳转登录页面 和login 一个效果
if user1 == 'alex' and pwd1 == '':
ret = request.GET.get('next', '/home/') # 直接登录home 也可以在别的页面next=xxx 登录
# 此时已经在login 中http://127.0.0.1:8000/login/?next=/home/ 就是后边就是加上next= xxx 也会跳转到登录页面
# rep = redirect('/home/')
rep = redirect(ret)
#网址栏http://127.0.0.1:8000/login/?next=/xxx 就返回这个页面 rep.set_signed_cookie('pwd2', pwd1, salt='s8') #加上path 就只能index访问
return rep
return render(request, 'longin.html') def wrapper(func):
def inner(request, *args, **kwargs):
# 装饰器之前要做的
user = request.get_signed_cookie('pwd2', None, salt='s8')
if not user: # 如果没得到要加盐的coolkie None 就返回登录页面
next_url = request.get_full_path() # 这个和get_path 区别就是获取800后边的多少
# get_full_path() 后边都可以获取 包括get请求
# 而 get_path() z只能获取800后边的一个url 不能获取get
return redirect('/login/?next={}'.format(next_url)) #还跳转登录页面
else: #如果得到了要加盐的cookie 装饰以下的函数 home index1(登录的时候next=index1 的时候 登录后还会返回index的页面)
return func(request, *args, **kwargs)
return inner @wrapper
def home(request):
user = request.get_signed_cookie('pwd2', salt='s8')
return render(request, 'home.html', {'username': user}) @wrapper ##你现在没有登录
def index1(request): return render(request, 'index1.html') def logout(request):
ret = redirect('/login/')
ret.delete_cookie('pwd2')
return ret
# ------------------------------------------------------------------------------------------------ # def cookie(fuc):
# def inner(request, *args, **kwargs):
# # 装饰的函数fuc 就是func1
# username = request.get_signed_cookie('pwd2', None, salt='s8')
# if not username:
# return redirect('/login/')
# return fuc(request,*args, **kwargs)
# return inner
# @cookie
# # func=cookie(func1)
#
# def index1(request):
# username = request.get_signed_cookie('pwd2', None, salt='s8')
# return render(request, 'index1.html', {'uesrw': username})
# @cookie
# def index2(request):
# username = request.get_signed_cookie('pwd2', None, salt='s8')
# return render(request, 'index2.html', {'uesrw': username})
#
cookie的练习
览器里面是有专门的设置选项,可以选择不保存cookie,但是我们设置了不保存cookie之后,登录一些页面的时候就无法登录成功,会有系统提示cookie没有开启,需要开启之后才能登录上
我们的cookie本质是在url上面添加的键对值,它的主要用途就是做登录校验用,我们的市面上主要的登录校验有两种方式:
1.加盐的cookie
数据都是保存在客户的浏览器上,服务端是没有什么压力的,
2.session
django中默认支持session,其内部提供了5种类型的session供开发者使用:
数据库(默认)
缓存文件
缓存+数据库
加密cookie
数据库session
数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
SESSION_COOKIE_NAME='sessionid'
# session的cookie保存在浏览器上是的key,即sessionid=随机字符串(默认)
SESSION_COOKIE_PATH='/'
# session的bookie保存路径(默认)
SESSION_COOKIE_DAMAIN=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 的公用设置
def index(request):
# 获取,设置,删除session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1']=123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1'] # 所有键,值,键值对
request.sessin.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems() # 用户session的随机字符串
request.session.session_key
#将所有session失效日期小雨当前日期的数据删除
request.session.clear_expired()
#检查用户session的随机字符串在数据库中是否存在
request.session.exists('session_key')
# 删除当前用户的所有sessison数据
request.session.delete() request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效
*如果value是个datatime或timedelta.session就会在这个时间之后失效
*如果value是0用户关闭浏览器session就会失效
*如果value是None,session会依赖全局session失效策略
session理论的基础
django 操作session的时候,都是request.xxx
session
是保存在服务端的'键对值'数据
session必须要依赖于cookie
我们的session里面的键对值数据是在我们创建django项目的时候,自动生成的django_session的数据库表格里面,它会系统自动保存进去,
表格里面的字段有session_key(键)
session_data(值)
expire_date(失效时间)这里一般是默认值14天之后就会自动清空,为了缓解数据库的压力,这些数据不会永久保存下去的,
我们使用session的时候,它内部需要做的几件事,:
1生成随机字符串
2回给浏览器,让它写到cookie
3自己保留一份,作为一个key,存到一个地方,key后面对应一个保存用户相关信息的键值对
# 关于session的练习
# def logins(request):
# if request.method== 'POST':
# user = request.POST.get('user')
# pwd = request.POST.get('pwd')
# if user == 'wang' and pwd == '111':
# # 设置session django封装好了包括三步(
# # 1生成特殊随机字符串
# # 2会给浏览器让它写到cookie
# # 3自己写一份 ,作为作为一个KEY存到一个地方,KEY后面对应一个保存用户相关信)
# request.session['k1'] = user
# return redirect('/indexs/')
# return render(request,'logins.html')
#
# def indexs(request):
# # session 的取值
# value = request.session.get('k1')
# # 获取随机字符串
# print(request.session.session_key)
# print('_' * 100)
# # 设置有效的时间 如果是None的话就要看settings
# request.session.set_expiry(10)
# return render(request,'indexs.html', {'value':value})
# #
# return HttpResponse(value) # 关于类的session 的练习
# 简单版开始
from django.views import View # class Login_View(View):
#
# def get(self,request):
# return render(request,'login_c.html')
#
# def post(self,request):
# user = request.POST.get('user')
# pwd = request.POST.get('pwd')
# if user == 'wang' and pwd == '111':
# # 登陆成功
# request.session['k1'] = user
# request.session.set_expiry(10)
# return redirect('/index_c/')
#
#
# class IndexView(View):
# def get(self, request):
# user = request.session.get('k1')
# return render(request,'index_c.html',{'user':user})
#
# # 这里有问题需要帮助?????
# class Exit(View):
# def logout_c(self, request):
# ret = redirect('/login_c/')
# ret.request.session.delete()
# return ret # 类的简单版结束-----------
# 类装饰器session的开始
# 先登陆
class Login_View(View): def get(self,request):
return render(request,'login_c.html') def post(self,request):
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'wang' and pwd == '':
# 登陆成功
# 设置session
request.session['k1'] = user
request.session.set_expiry(10)
return redirect('/index_c/') def wrapper(func):
@wraps(func)
def inner(request, *args, **kwargs):
user3 = request.session.get('k1', None)
if not user3:
return redirect('/login_c/')
else:
ret = func(request, *args, **kwargs)
return ret
return inner from django.utils.decorators import method_decorator #类的装饰器
@method_decorator(wrapper, name='get') #第一种针对get 固定用法 name 和函数绑定 外边加name
class IndexView(View): # @method_decorator(wrapper) #和第三种配合是针对 post get
# def dispatch(self, request, *args, **kwargs): #第三种 针对post 和 get, 不加上句和第二种搭配
# return super(IndexView,self).dispatch( request, *args, **kwargs) #继承父类的 # 第二种针对get@method_decorator(wrapper) # 固定用法 name 和函数绑定 get函数里 不加name
def get(self, request):
user = request.session.get('k1')
print(request.session.session_key)
return render(request,'index_c.html',{'user':user})
# 类装饰器session的开始
session 练习

CBV的session的url 的固定用法


day 71-72 cookie 和session的更多相关文章
- 深入理解Cookie和Session机制
		转载理解Cookie和Session机制 目录 Cookie机制什么是CookieCookie的不可跨域名性Unicode编码:保存中文BASE64编码:保存二进制图片设置Cookie的所有属性Coo ... 
- 会话技术中的Cookie与session
		关于会话技术 会话:一次会话中包含多次请求和响应. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:C ... 
- Cookie和Session的总结
		1.开篇 在之前学习这一段的时候我一直有点没弄清楚,其实对Session这块的理解还可以,但是Cookie感觉始终还是欠缺点火候.之后的很长一段时间都基本上很少用Cookie了,渐渐的也淡忘了这一块的 ... 
- java的会话管理:Cookie和Session
		java的会话管理:Cookie和Session 1.什么是会话 此处的是指客户端(浏览器)和服务端之间的数据传输.例如用户登录,购物车等 会话管理就是管理浏览器客户端和服务端之间会话过程产生的会话数 ... 
- Cookie和Session的那些事儿
		Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计,提高访问性能.Cookie是客户端(也就是浏览器端)的技术,设置了Cookie之后,每 ... 
- django的cookie和session以及内置信号、缓存
		cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ... 
- Cookie和Session的区别
		前言 HTTP是一种无状态的协议,为了分辨链接是谁发起的,就需要我们自己去解决这个问题.不然有些情况下即使是同一个网站我们每打开一个页面也都要登录一下.而Session和Cookie就是为解决这个问题 ... 
- 本地数据Store。Cookie,Session,Cache的理解。Timer类主要用于定时性、周期性任务 的触发。刷新Store,Panel
		本地数据Store var monthStore = Ext.create('Ext.data.Store', { storeId : 'monthStore', autoLoad : false, ... 
- Cookie与Session
		再说Cookie与Session之前,先要了解一下http协议. 何为http协议: http协议即超文本传输协议,一种基于浏览器请求与服务器响应的协议,该协议主要的特点就是它是一种无状态的协议(只针 ... 
- 【转】Cookie和Session区别和联系详解
		会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ... 
随机推荐
- 架构探险笔记5-使框架具备AOP特性(下)
			开发AOP框架 借鉴SpringAOP的风格,写一个基于切面注解的AOP框架.在进行下面的步骤之前,确保已经掌了动态代理技术. 定义切面注解 /** * 切面注解 */ @Target(Element ... 
- pytorch构建自己设计的层
			下面是如何自己构建一个层,分为包含自动反向求导和手动反向求导两种方式,后面会分别构建网络,对比一下结果对不对. -------------------------------------------- ... 
- 突破本地离线存储5M限制的JS库localforage简介
			http://www.zhangxinxu.com/wordpress/2018/06/js-localforage-localstorage-indexdb/ 
- JQuery Tree插件
			转载这个,这个非常的全,有时间可以去学习学习:http://ztreeapi.iteye.com/ http://ztreeapi.iteye.com/blog/2028608 
- leetcode-algorithms-4 Median of Two Sorted Arrays
			leetcode-algorithms-4 Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of siz ... 
- c++中利用localtime_s函数格式化输出当地日期与时间
			Visual C++ 6.0开发环境中显示当地日期与时间主要通过localtime()函数来实现,该函数的原型在time.h头文件中,其语法格式如下: struct tm *localtime(xon ... 
- 判断input[type=file]上传文件格式
			input type="file" 在js中判断文件上传类型 function onSubmit(){ var form1 = document.forms[0]; var fil ... 
- input上传限定文件类型
			input上传限定文件类型 accept="image/*" 限定为只能上传图片 accept=”audio/* 限定为只能上传音频 accept=”video/*” 限定 ... 
- iphone手机在网页返回上一页时,部分字体变大问题
			最近做一个项目是,发现了一个iphone的兼容性问题,在返回上一页后,部分字体会变大,刷新就会正常. 经过总结,发现都是span标签里面的字体变大.经过查询发现,需要给span添加一个属性:displ ... 
- sharding-jdbc读写分离原理解读
			原帖地址:https://blog.csdn.net/yanyan19880509/article/details/78170233 前言 很多时候,为了应付DB的高并发读写,我们会采用读写分离技术. ... 
