COOKIE&SESSION

知识储备

  由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。

  cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。

  cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。

  问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。

  我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

  总结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本

Django实现COOKIE

设置cookie

  1. obj = HttpResponse(...) obj render(request, ...) obj redirect()
  2. obj.set_cookie(key,value,...)
    obj.set_signed_cookie(key,value,salt='加密盐',...)

获取cookie

  1. request.COOKIES.get('key')
    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

删除cookie

  1. response.delete_cookie("cookie_key",path="/",domain=name)

参数

  1. key,
  2. value='',
  3. max_age=None, 超长时间
  4. expires=None, 超长时间
  5. path='/', Cookie生效的路径,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
  6. domain=None, Cookie生效的域名你可用这个参数来构造一个跨站cookie。如, domain=".example.com"所构造的cookie对下面这些站点都是可读www.example.com www2.example.com
  7. an.other.sub.domain.example.com
  8. 如果该参数设置为 None cookie只能由设置它的站点读取。
  9.  
  10. secure=False, 如果设置为 True ,浏览器将通过HTTPS来回传cookie
  11. httponly=False 只能http协议传输,无法被JavaScript获取
  12. (不是绝对,底层抓包可以获取到也可以被覆盖
  1. $.cookie("key", value,{ path: '/' })

jquery操作cookie

Django实现SESSION

设置Session

  1. request.session['key']='value'
  2. '''
  3. 实际进行的操作:
  4. 1. 检查请求是否有sessionid,且是否存在与数据库,存在则对session_data进行更新
  5. 2. 若不等,则创建随机字符串
  6. 3. set_cookie('sessionid','随机字符串')
  7. 4. 在session表中添加记录
  8. session-key session-data
  9. 随机字符串 {"key":"value"}-------------进行处理后的
  10. '''

获取Session

  1. session_name=request.session['key']
  2. '''
  3. 实际进行了哪些操作:
  4. 1. 取随机字符串request.COOKIE.get('sessionid')
  5. 2. 在session表中进行过滤:
  6. obj=django-session.objects.filter(session-key=random_str).first()
  7. obj.session-data.get("user")
  8.  
  9. '''

其他

  1. #删除Sessions值
  2. del request.session["session_name"]
  3. #检测是否操作session值
  4. if "session_name" is request.session:

配置

  1. Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
  2.  
  3. a. 配置 settings.py
  4.  
  5. SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
  6.  
  7. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
  8. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径(默认)
  9. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
  10. SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
  11. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
  12. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
  13. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
  14. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认

数据库配置(配置)

  1. a. 配置 settings.py
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
  4. SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
  5.  
  6. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
  7. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径
  8. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
  9. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
  10. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
  11. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
  12. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
  13. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

缓存配置

  1. a. 配置 settings.py
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
  4. SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
  5. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
  6. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径
  7. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
  8. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
  9. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
  10. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
  11. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
  12. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

文件配置

  1. def login_session(request):
  2. if request.method=='POST':
  3. user=request.POST.get('user')
  4. pwd=request.POST.get('pwd')
  5. ret=UserInfo.objects.filter(name=user,pwd=pwd)
  6. if ret:
  7. request.session['user']=user
  8. return redirect('/index_session/')
  9. return render(request,'login.html')
  10.  
  11. def index_session(request):
  12. user=request.session.get('user')
  13. if not user:
  14. return redirect('/login_session/')
  15. return render(request,'index.html',locals())

Django的用户认证

  1. #先settings配置用户表
  2. AUTH_USER_MODEL="blog.UserInfo"

auth

  1. 利用auth模块中的一些方法来进行认证
  2. from django.contrib import auth

authenticate()

提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数

如果认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的

  1. user = authenticate(username='someone',password='somepassword')

login(HttpRequest, user)

该函数接受一个HttpRequest对象,以及一个认证了的User对象

此函数使用django的session框架给某个已认证的用户附加上session id等信息。

  1. login(request, user)

logout(request)

该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

  1. logout(request)

User对象

User 对象属性:

username, password(必填项)password用哈希算法保存到数据库

is_staff : 用户是否拥有网站的管理权限.

is_active : 是否允许用户登录, 设置为``False``,可以不用删除用户来禁止 用户登录

is_authenticated()

如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

  1. if not request.user.is_authenticated():
  2. return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

django自带用于此种情况的装饰器:login_requierd()

  1. from django.contrib.auth.decorators import login_required
  2.  
  3. @login_required
  4. def my_view(request):

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递  当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

创建用户

  1. from django.contrib.auth.models import User
  2. user = User.objects.create_userusername='',password='',email=''

修改密码set_password()

  1. user = User.objects.get(username='')
  2. user.set_password(password='')
  3. user.save

check_password(passwd)

用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回 True

基于auth认证实现登录:

  1. def login(request):
  2. '''
  3. 登录验证
  4. :param request:
  5. :return:
  6. '''
  7. if request.method=='POST':
  8. username=request.POST.get('username')
  9. pwd=request.POST.get('pwd')
  10. input_valid_code=request.POST.get('valid_code')
  11. valid_code=request.session.get('valid_code')
  12. login_response={'user':None,'error_msg':''}
  13. #进行验证码的比较
  14. if valid_code.upper()==input_valid_code.upper():
  15. user=auth.authenticate(username=username,password=pwd)
  16. if user:
  17. auth.login(request,user)
  18. login_response['user']=user.username
  19. else:
  20. login_response['error_msg']='用户名或密码错误!'
  21. else:
  22. login_response['error_msg']='验证码错误!'
  23. import json
  24. return HttpResponse(json.dumps(login_response))
  25. return render(request,'login.html',locals())

Django实现cookie&session以及认证系统的更多相关文章

  1. 概念与用法-cookie,session,auth (认证系统)

    COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...

  2. day09 Django: 组件cookie session

    day09 Django: 组件cookie session   一.cookie和session都是会话跟踪技术     1.什么是会话             可以理解为客户端和服务端之间的一次会 ...

  3. Django之自带的认证系统 auth模块

    01-Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dj ...

  4. python 全栈开发,Day76(Django组件-cookie,session)

    昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...

  5. Django中cookie&session的实现

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

  6. Django之cookie+session

    前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...

  7. Django之cookie&session

    cookie Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息 ...

  8. django框架--cookie/session

    目录 一.http协议无状态问题 二.会话跟踪技术--cookie 1.对cookie的理解 2.cookie的使用接口 3.cookie的属性 4.使用cookie的问题 三.会话跟踪技术--ses ...

  9. Django组件-cookie,session

    昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反 ...

随机推荐

  1. 让A超链接无效的办法 阻止元素发生默认的行为

    $("a").click(function(event){ event.preventDefault(); }); event.preventDefault(); 方法阻止元素发生 ...

  2. 【CF917D】Stranger Trees 树形DP+Prufer序列

    [CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出 ...

  3. s3cmd在配置后使用时提示ERROR: S3 error: 403 (InvalidAccessKeyId): The AWS Access Key Id you provided does not exist in our records.

    自己新建的ceph环境,下载了s3cmd来做客户端,使用了s3cmd --configure配置后,在使用s3cmd ls可以查看到所有的bucket,但s3cmd ls s3://xxx 具体buc ...

  4. sublime添加到鼠标右键打开文件的方法?

    步骤: 1.win+R 打开运行,并输入regedit. 2.在左侧依次打开HKEY_CLASSES_ROOT\*\shell 3.在shell下新建“Sublime Text”项,在右侧窗口的“默认 ...

  5. poj3662 Telephone Lines【最短路】【二分】

    http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  6. poj3168 Barn Expansion【计算几何 平面扫描】

    Farmer John has N (1 <= N <= 25,000) rectangular barns on his farm, all with sides parallel to ...

  7. windows下安装pytorch

    安装: https://blog.csdn.net/xiangxianghehe/article/details/80103095 Windows下通过pip安装PyTorch 0.4.0 impor ...

  8. Mapreduce 原理及程序分析

    1.MapReduce(Map+Reduce) 提出一个问题: 目标:你想数出一摞牌中有多少张黑桃. 直观方式:一张一张检查并且数出有多少张是黑桃数目 MapReduce方法则是: 给在座的所有玩家中 ...

  9. IntelliJ IDEA学习记录

    一.下载 地址:官网下载地址 二.安装 运行安装程序,一路下一步.注意选择安装路径. 三.基本概念 project:相当于donet中的解决方案(solution),eclipse中的工作空间(wor ...

  10. UVALive 3938 - "Ray, Pass me the dishes!" - [最大连续子列和+线段树]

    题目链接:https://cn.vjudge.net/problem/UVALive-3938 参考刘汝佳书上说的: 题意: 给出一个长度为n的序列, 再给出m个询问, 每个询问是在序列 $[a,b] ...