• cookie与session

    概念

    因http协议无法保存状态,但是又需要保存状态,所以有了cookie。它不属于http协议范畴

    工作原理:相当于一段标识数据。在访问服务器产生标识内容(cookie),加入到响应里返回,浏览器再次访问时会自动带上cookie。服务器就能识别出身份了。 数据缓存在浏览器中。减轻服务器端的压力。但安全性不高。

    cookie随可实现保持状态,但其最大支持4096字节,且保存在客户端不安全,于是产生了支持更多字节,保存在服务端的机制--session。

    session的机制:给客户端cookie加入不同的ID,访问时提供cookie,服务端根据ID拿出私密的数据,就可以识别出身份了。

    但是cookie中内容被盗依然危险,所以有了失效时间。

    总结:cookie与session要配合使用。cookie弥补了http无状态的不足,但存在客户端且安全性差。所以仅用cookie存标识号(sessionID),它对应服务端存的数据。

    是开发界共通的概念

    django实现cookie

    • 获取cookie
    1. request.COOKIES['key']
    2. request.get_signed_cookie(key,default=RAISE_ERROR,salt='',max_age=None)
    3. default:默认值
    4. salt:加密盐
    5. max_age:过期时间
    • 设置cookie
    1. res = 任何一种响应方式实例对象。
    2. res.set_cookie(key,value,……)
    3. res.set_signed_cookie(key,value,salt='加密盐',……)
    1. def set_cookie(self, key,
    2.         value='',
    3.         max_age=None, 超长时间
    4.         expires=None, 超长时间
    5.         path='/', Cookie生效的路径,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。
    6. / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
    7.             
    8. domain=None, Cookie生效的域名
    9. 你可用这个参数来构造一个跨站cookie
    10. 如, domain=".example.com"
    11. 所构造的cookie对下面这些站点都是可读的:
    12. www2.example.com
    13.             an.other.sub.domain.example.com
    14. 如果该参数设置为 None cookie只能由设置它的站点读取。
    15.         secure=False, 如果设置为 True ,浏览器将通过HTTPS来回传cookie
    16.         httponly=False 只能http协议传输,无法被JavaScript获取
    17. (不是绝对,底层抓包可以获取到也可以被覆盖)
    18.           ): pass

    由于cookie保存在客户端,所以,JavaScript和jquery也可以操作cookie。

    1. <script src='/static/js/jquery.cookie.js'>
    2. </script> $.cookie("key", value,{ path: '/' });
    • 删除cookie res.delete_cookie("cookie_key",path="/",domain=name)

    Django实现session

    1. 设置session
    2. request.session['sname']="root"
    3. 获取session
    4. sname = request.session['sname']
    5. 删除session
    6. del request.session['sname']
    7. 检测是否操作session
    8. if "sname" is request.session
    9. .get
    10. .pop
    11. .keys
    12. .items
    13. .setdefault
    14. .flush 删数据和cookie
    15. .session_key
    16. .clear_expired
    17. .exists
    18. .delete 删数据
    19. .set_expiry(value)
    20. * 如果value是个整数,session会在些秒数后失效。
    21. * 如果value是个datatimetimedeltasession就会在这个时间后失效。
    22. * 如果value0,用户关闭浏览器session就会失效。
    23. * 如果valueNone,session会依赖全局session失效策略。

    流程解析图

    1. 登录后生产个字典,字典存入session库,key是随机标识。value是数据字典
    2. 在value中存信息。
    3. 把Key写入cookie中返回,request.session看到的是value。

    总结:Django中用session时,cookie由服务端生成,写到请求里返回给浏览器。浏览器会缓存。cookie是寻找用户信息的唯一标识。

    session函数示例

    1. def log_in(request):
    2. if request.method=="POST":
    3. username=request.POST['user']
    4. password=request.POST['pwd']
    5. user=UserInfo.objects.filter(username=username,password=password)
    6. if user:
    7. #设置session内部的字典内容
    8. request.session['is_login']='true'
    9. request.session['username']=username
    10. #登录成功就将url重定向到后台的url
    11. return redirect('/backend/')
    12. #登录不成功或第一访问就停留在登录页面
    13. return render(request,'login.html')
    14. def backend(request):
    15. print(request.session,"------cookie")
    16. print(request.COOKIES,'-------session')
    17. """
    18. 这里必须用读取字典的get()方法把is_login的value缺省设置为False,
    19. 当用户访问backend这个url先尝试获取这个浏览器对应的session中的
    20. is_login的值。如果对方登录成功的话,在login里就已经把is_login
    21. 的值修改为了True,反之这个值就是False的
    22. """
    23. is_login=request.session.get('is_login',False)
    24. #如果为真,就说明用户是正常登陆的
    25. if is_login:
    26. #获取字典的内容并传入页面文件
    27. cookie_content=request.COOKIES
    28. session_content=request.session
    29. username=request.session['username']
    30. return render(request,'backend.html',locals())
    31. else:
    32. """
    33. 如果访问的时候没有携带正确的session,
    34. 就直接被重定向url回login页面
    35. """
    36. return redirect('/login/')
    37. def log_out(request):
    38. """
    39. 直接通过request.session['is_login']回去返回的时候,
    40. 如果is_login对应的value值不存在会导致程序异常。所以
    41. 需要做异常处理
    42. """
    43. try:
    44. #删除is_login对应的value值
    45. del request.session['is_login']
    46. # OR---->request.session.flush() # 删除django-session表中的对应一行记录
    47. except KeyError:
    48. pass
    49. #点击注销之后,直接重定向回登录页面
    50. return redirect('/login/')
    1. ===================================login.html==================
    2. <!DOCTYPE html>
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <title>Title</title>
    7. </head>
    8. <body>
    9. <form action="/login/" method="post">
    10. <p>用户名: <input type="text" name="user"></p>
    11. <p>密码: <input type="password" name="pwd"></p>
    12. <p><input type="submit"></p>
    13. </form>
    14. </body>
    15. </html>
    16. ===================================backend.html==================
    17. <!DOCTYPE html>
    18. <html lang="en">
    19. <head>
    20. <meta charset="UTF-8">
    21. <title>Title</title>
    22. </head>
    23. <body>
    24. <h3>hello {{ username }}</h3>
    25. <a href="/logout/">注销</a>
    26. </body>
    27. </html>

    session存储的相关配置

    • 数据库配置(默认)
    1. Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
    2. a. 配置 settings.py
    3. SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
    4. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    5. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径(默认)
    6. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
    7. SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
    8. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
    9. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
    10. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
    11. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
    • 缓存配置
    1. a. 配置 settings.py
    2. SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
    3. SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    4. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    5. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径
    6. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
    7. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
    8. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
    9. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
    10. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
    11. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
    • 文件配置(了解)
    1. a. 配置 settings.py
    2. SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
    3. SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
    4. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    5. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径
    6. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
    7. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
    8. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
    9. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
    10. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
    11. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

    用户认证

    auth模块

    导入

    1. from django.contrib import auth

    authenticate

    用户认证,需要user和password关键字参数,认证有效会返回user对象,该对象会在后续的登录过程中使用。

    login

    认证成功后登录并返回页面 接收一个HttpRequest对象,以及认证后生成的user对象。
    会给已认证的用户附加上sessionID等信息。

    logout

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

    login认证后user对象的is_authenticated

    判断认证是否通过。 不验证权限和激活状态。

    实现未登录跳到登录,登录后再跳回来。

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

    auth.models的user对象

    1. is_staff 是否有管理权限
    2. is_active 是否允许登录

    创建用户create_user

    1. user = User.objects.create_userusername='',password='',email=''

    密码验证check_password

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

    修改密码set_password

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

    示例

    注册

    1. def sign_up(request):
    2. state = None
    3. if request.method == 'POST':
    4. password = request.POST.get('password', '')
    5. repeat_password = request.POST.get('repeat_password', '')
    6. email=request.POST.get('email', '')
    7. username = request.POST.get('username', '')
    8. if User.objects.filter(username=username):
    9. state = 'user_exist'
    10. else:
    11. new_user = User.objects.create_user(username=username, password=password,email=email)
    12. new_user.save()
    13. return redirect('/book/')
    14. content = {
    15. 'state': state,
    16. 'user': None,
    17. }
    18. return render(request, 'sign_up.html', content)  

    改密码

    1. @login_required
    2. def set_password(request):
    3. user = request.user
    4. state = None
    5. if request.method == 'POST':
    6. old_password = request.POST.get('old_password', '')
    7. new_password = request.POST.get('new_password', '')
    8. repeat_password = request.POST.get('repeat_password', '')
    9. if user.check_password(old_password):
    10. if not new_password:
    11. state = 'empty'
    12. elif new_password != repeat_password:
    13. state = 'repeat_error'
    14. else:
    15. user.set_password(new_password)
    16. user.save()
    17. return redirect("/log_in/")
    18. else:
    19. state = 'password_error'
    20. content = {
    21. 'user': user,
    22. 'state': state,
    23. }
    24. return render(request, 'set_password.html', content)

Django--4、认证系统的更多相关文章

  1. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  2. “Django用户认证系统”学习资料收集

    首推追梦人物——Django用户认证系统 待续……

  3. Django之认证系统

    Django之认证系统 cookie和session 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞 ...

  4. Django的认证系统—auth模块

    Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...

  5. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...

  6. django用户认证系统——修改密码6

    再此之前我们已经完成了用户登录.注册.注销等功能,接下来让我们继续为用户提供修改密码的功能.该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样. 编写修改密码模 ...

  7. django用户认证系统——拓展 User 模型2

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  8. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

  9. D django 用户认证系统

    django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...

  10. Django用户认证系统(二)Web请求中的认证

    在每个Web请求中都提供一个 request.user 属性来表示当前用户.如果当前用户未登录,则该属性为AnonymousUser的一个实例,反之,则是一个User实例. 你可以通过is_authe ...

随机推荐

  1. Linux下tmp文件夹的文件自动删除的问题(转)

    场景: 近日发现有一台机器tmp文件夹下放置的文件无辜丢失,而且排查发现是自动丢失,并且,只是删除10天之前的文件. 本来以为是哪位写了一个自动执行脚本, find了一下10天前的文件删除了. 结果, ...

  2. test markdown 写博客

    欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想 ...

  3. C#写的NoSQL开源项目/系统(系列)

    http://www.cnblogs.com/unruledboy/archive/2013/01/07/CSharpNoSQL.html 闲扯 好久没写开源项目了,也没写对新开源项目的介绍,今晚看了 ...

  4. Android之AssetManager使用

    1. 获取AssetManager AssetManager assetManager = context.getAssets(); 2. 列出assets文件夹下全部文件 String[] file ...

  5. 在GNS3下使用Cisco SDM 的教程

    安装步骤: 1..先安装jre-6u17-windows-i586se (最新版的)如图: 点击安装,直到安装完成. © 2.安装SDM2.5中文版SDM-V25 如图 : 出现欢迎安装向导,点击下一 ...

  6. Android Toast小解

    简单介绍:Toast英文含义是吐司,在Android中.它就像烘烤机里做好的吐司弹出来,并持续一小段时间后慢慢消失. Toast也是一个容器,能够包括各种View,并承载着它们显示. Android中 ...

  7. Linux下完美使用find+grep实现全局代码搜索

    作者:zhanhailiang 日期:2014-10-11 背景 在Window下有大量方便的图形化工具能够实现全局搜索,可是Linuxserver中因为使用命令行操作导致全局搜索是一个比較高的门槛. ...

  8. Java算法-奇怪的分式

    题目: 上小学的时候,小明常常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明竟然把分子拼接在一起,分母拼接在一起,答案是:18/45 老师刚想批评他.转念一想.这个答案凑巧也对啊, ...

  9. Android 5.1 Settings源代码简要分析

    转载请注明出处,谢谢~http://blog.csdn.net/u011974987/article/details/51004854. 概述: 先声明:本人工作快两年了,仍是菜鸟级别的.羞愧啊!曾经 ...

  10. Python3 读取和写入excel

    https://blog.csdn.net/weixin_43094965/article/details/82226263一.Excel 1.Excel文件三个对象 workbook: 工作簿,一个 ...