1.有状态服务与无状态服务

  服务实例存储了客户端的数据 ,那么这就是个有状态服务

  服务实例不存储客户端数据 ,让其他缓存存储客户端数据 ,这就是无状态服务 ,http就是无状态的

2.什么是cookie

  服务端保存在客户端的键值对信息 ,每次客户端访问会携带cookie ,服务端对cookie进行判断操作

3.登录功能封装cookie

  可以看到使用post请求给response对象封装了一个k:v ,跳转到presslist就会拿到这个值

def presslist(request):
ck = request.COOKIES.get('user')
print(ck)
msg_all = models.presslist.objects.all()
return render(request, 'cbs.html', {'msg': msg_all})
class tlogin(View):

    def get(self, request):
if request.COOKIES.get('user'):
return redirect(reverse('presslist'))
return render(request, 'login.html') def post(self, request):
user = request.POST.get('user')
password = request.POST.get('password')
print(user, password)
if models.Author.objects.filter(name=user, password=password):
ret = redirect(reverse('presslist'))
# 在response对象中封装cookie ,下次客户端会带过来
ret.set_cookie('user', 'auth')
return ret return render(request, 'login.html')

  装饰器 :设想如果所有的视图都要求有cookie的客户端才使用 ,那么我们需要给每个视图加上判断cookie ,所以我们使用一个装饰器来完成 ,后面可以使用中间件对全局函数处理

def wrap1(func):
def inner(request, *args, **kwargs):
if request.COOKIES.get('user'):
ret = func(request, *args, **kwargs)
return ret
return redirect(reverse('tlogin')) return inner @wrap1
def presslist
...
@wrap1
def pressadd
...
@wrap1
def pressedit
...
@wrap1
def pressdel def tlogin()
...

  保留用户搜索 :用户可以浏览我们的展示界面 ,但是使用新增的时候我们需要登录 ,登录后如果能跳转到新增页面才是符合体验的 ,所以我们要修改登录跳转

##如果没有登录 ,跳转登录页面时会携带一个参数 ,就是用户想访问,但是需要登录的地址
def wrap1(func):
def inner(request, *args, **kwargs):
if request.COOKIES.get('user'):
ret = func(request, *args, **kwargs)
return ret
# 保留用户记录 ,拼接到地址上
nowurl = request.path_info
return redirect(reverse('tlogin') + '?next={}'.format(nowurl)) return inner ##如果登陆成功 ,这时候要求跳转到用户想访问,但是需要登录的地址 ,在url中取出来 ,如果没有默认就是去presslist
class tlogin(View): def get(self, request):
if request.COOKIES.get('user'):
return redirect(reverse('presslist'))
return render(request, 'login.html') def post(self, request):
user = request.POST.get('user')
password = request.POST.get('password')
if models.Author.objects.filter(name=user, password=password):
url = reverse('presslist')
next = request.GET.get('next')
if next:
url = next
ret = redirect(url)
# 在response对象中封装cookie ,下次客户端会带过来
ret.set_cookie('user', 'auth')
return ret return render(request, 'login.html')

  cookie在django的使用方式

    1.设置cookie

      1)获取httpresponse对象ret ,一般在login函数中获取

      2)ret.set_cookie(key,value) ,设置cookie

      3)使用装饰器帮忙去每个函数验证cookie是否存在request.COOKIES.get(key)

      4)设置cookie的超时时间ret.set_cookie(key,value,max_age=10) ,设置10秒后超时

      5)仅针对某个url设置cookie ,ret.set_cookie(key,value,path='/app01/addpress')

    2.删除cookie (注销功能)

      ret.delete_cookie('authck')  删除cookie中的一个键值对

#前端设置注销按钮

##
#urls.py
url(r'logout/', views.logout),
#views.py
def logout(request):
ret = redirect('/app01/login2/')
ret.delete_cookie('authck')
return ret

4.什么是session

  session与cookie类似都是键值对 ,但是session为了安全保存在了服务器 ,把sessionid放入cookie给客户端存储 ,每次客户端访问服务器 ,服务器根据cookie中存储的sessionid来判断用户

  django中使用了一个db表存储session信息django_session表

    session_key字段存储客户端的sessionid

    session_data存储加密的客户端数据

    expire_date存储这条session记录过期时间 (可以通过设置变更)

5. 登录功能封装session

  与cookie的唯一区别是 ,将session放在了request对象中 ,cookie放在了response对象中 ,就算session放入了request对象中 ,客户端也会接收到cookie存储了sessionid

##装饰器修改 ,从request中获取session
def wrap1(func):
def inner(request, *args, **kwargs):
# if request.COOKIES.get('user'):
if request.session.get('auth'):
ret = func(request, *args, **kwargs)
return ret
# 保留用户记录 ,拼接到地址上
nowurl = request.path_info
return redirect(reverse('tlogin') + '?next={}'.format(nowurl)) return inner ##登录函数使用在request对象中创建了一个字典
class tlogin(View): def get(self, request):
if request.COOKIES.get('user'):
return redirect(reverse('presslist'))
return render(request, 'login.html') # 要在post请求中处理跳转 ,因为只有登录成功才能跳转用户记录
def post(self, request):
user = request.POST.get('user')
password = request.POST.get('password')
if models.Author.objects.filter(name=user, password=password):
url = reverse('presslist')
next = request.GET.get('next')
if next:
url = next
ret = redirect(url)
# 在response对象中封装cookie ,下次客户端会带过来
# ret.set_cookie('user', 'auth')
request.session['auth'] = 'user'
return ret return render(request, 'login.html')

  django中使用session与操作字典相同

    request.session.get(key)          #获取到session

    request.session.set_expiry(time)  #设置session超时时间

    request.session.flush()      # 删除该回话浏览器与服务器的信息 ,与cookie相同做注销使用

  查看session和配置session

    from django.conf import global_settings      #点击global_settings可以查看修改

1.session存储方式

  数据库session(默认)
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'
  cache存储session (redis memcache)
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
    SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
  缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
2.session其他通用设置
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,默认修改之后才保存(默认)

  

django7-cookie与session的更多相关文章

  1. Cookie和Session的总结

    1.开篇 在之前学习这一段的时候我一直有点没弄清楚,其实对Session这块的理解还可以,但是Cookie感觉始终还是欠缺点火候.之后的很长一段时间都基本上很少用Cookie了,渐渐的也淡忘了这一块的 ...

  2. java的会话管理:Cookie和Session

    java的会话管理:Cookie和Session 1.什么是会话 此处的是指客户端(浏览器)和服务端之间的数据传输.例如用户登录,购物车等 会话管理就是管理浏览器客户端和服务端之间会话过程产生的会话数 ...

  3. Cookie和Session的那些事儿

    Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计,提高访问性能.Cookie是客户端(也就是浏览器端)的技术,设置了Cookie之后,每 ...

  4. django的cookie和session以及内置信号、缓存

    cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...

  5. Cookie和Session的区别

    前言 HTTP是一种无状态的协议,为了分辨链接是谁发起的,就需要我们自己去解决这个问题.不然有些情况下即使是同一个网站我们每打开一个页面也都要登录一下.而Session和Cookie就是为解决这个问题 ...

  6. 本地数据Store。Cookie,Session,Cache的理解。Timer类主要用于定时性、周期性任务 的触发。刷新Store,Panel

    本地数据Store var monthStore = Ext.create('Ext.data.Store', { storeId : 'monthStore', autoLoad : false, ...

  7. Cookie与Session

    再说Cookie与Session之前,先要了解一下http协议. 何为http协议: http协议即超文本传输协议,一种基于浏览器请求与服务器响应的协议,该协议主要的特点就是它是一种无状态的协议(只针 ...

  8. 【转】Cookie和Session区别和联系详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  9. 理解Cookie和Session机制(转)

    目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...

  10. cookie 和session 的区别详解

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

随机推荐

  1. Linux系统:centos7下搭建ZooKeeper3.4中间件,常用命令总结

    本文源码:GitHub·点这里 || GitEE·点这里 一.下载解压 1.Zookeeper简介 Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供 ...

  2. 利用css将英文转为大写或小写

    项目需要在后台接收的字段值为小写,但在页面上显示大写英文,但操作页面之后,最终传给后台的依旧是小写,所以就需要使用css转化一下即可 <li>This.is.a.book,全部转为大写:& ...

  3. 在做nav-bar部分点击路由跳转相同地址时,控制台报错问题。

    报错信息: Uncaught (in promise) NavigationDuplicated {_name: "NavigationDuplicated", name: &qu ...

  4. CSS学习笔记-背景属性

    一.背景尺寸属性:    1.含义:        背景尺寸属性是CSS3中新增的一个属性,专门用于设置背景图片大小 2.格式:        1.1具体像素:             backgro ...

  5. Cobalt Strike系列教程第五章:截图与浏览器代理

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  6. Linux使用BIND提供域名解析服务

    DNS(Domain Name System,域名系统)用于管理和解析域名与IP地址对应关系的技术. 主服务器:在特定区域内具有唯一性,负责维护该区域内的域名与IP地址之间的对应关系. 从服务器:从主 ...

  7. 进一步使用 模板缓冲(stencil)

    最近做课题的时候需要计算一个 view(就是一次渲染得到的帧) 下的重叠像素个数(两个物体或更多的物体重叠). 最开始我的想法是渲染一个物体输出一张纹理,这样对比物体之间的纹理就知道重叠了.但是这样当 ...

  8. JUC-8-lock和Condition使用

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAADHCAYAAABySz3ZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw ...

  9. 新手springmvc web简单搭建过程-caidachun

    第一次做整了一天,中间各种报错,大佬肯定要嘲笑我了,但还是很有成就敢,现在只知道怎么装配,还不知道为什么,还需要学习.加油 1.新建动态web项目 2. 添加jar包,可以到网上下载,commons- ...

  10. (转)vue-router原理

    转载地址:https://segmentfault.com/a/1190000014822765 随着前端应用的业务功能起来越复杂,用户对于使用体验的要求越来越高,单面(SPA)成为前端应用的主流形式 ...