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

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

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

    Django实现session

    设置session值
    request.session['sname']="root" 获取session值
    sname = request.session['sname'] 删除session值
    del request.session['sname'] 检测是否操作session值
    if "sname" is request.session .get
    .pop
    .keys
    .items
    .setdefault
    .flush 删数据和cookie
    .session_key
    .clear_expired
    .exists
    .delete 删数据 .set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。

    流程解析图

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

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

    session函数示例

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

    session存储的相关配置

    • 数据库配置(默认)
    Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
    
    a. 配置 settings.py
    
        SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
        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,默认修改之后才保存(默认)
    • 缓存配置
    a. 配置 settings.py
    
        SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 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,默认修改之后才保存
    • 文件配置(了解)
    a. 配置 settings.py
    
        SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
    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,默认修改之后才保存

    用户认证

    auth模块

    导入

    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对象

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

    创建用户create_user

    user = User.objects.create_user(username='',password='',email='')

    密码验证check_password

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

    修改密码set_password

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

    示例

    注册

    def sign_up(request):
    
        state = None
    if request.method == 'POST': password = request.POST.get('password', '')
    repeat_password = request.POST.get('repeat_password', '')
    email=request.POST.get('email', '')
    username = request.POST.get('username', '')
    if User.objects.filter(username=username):
    state = 'user_exist'
    else:
    new_user = User.objects.create_user(username=username, password=password,email=email)
    new_user.save() return redirect('/book/')
    content = {
    'state': state,
    'user': None,
    }
    return render(request, 'sign_up.html', content)  

    改密码

    @login_required
    def set_password(request):
    user = request.user
    state = None
    if request.method == 'POST':
    old_password = request.POST.get('old_password', '')
    new_password = request.POST.get('new_password', '')
    repeat_password = request.POST.get('repeat_password', '')
    if user.check_password(old_password):
    if not new_password:
    state = 'empty'
    elif new_password != repeat_password:
    state = 'repeat_error'
    else:
    user.set_password(new_password)
    user.save()
    return redirect("/log_in/")
    else:
    state = 'password_error'
    content = {
    'user': user,
    'state': state,
    }
    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. Servlet发送邮件

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/sending-email.html: 使用Servlet发送一封电子邮件是非常简单的,但是开始之 ...

  2. centos7grub2 引导win10

    centos7+win10安装完成之后,使用gurb2引导win10系统 方式:使用ntfs-3g 步骤: 1.加源  wget -O /etc/yum.repos.d/epel.repo http: ...

  3. go语言中的timer 和ticker定时任务

    https://mmcgrana.github.io/2012/09/go-by-example-timers-and-tickers.html --------------------------- ...

  4. gcc 5.2.0 编译安装笔记-20151110

    **转载请注明出处** by.haunying3 系统版本号 CentOS-6.6-x86_64-minimal 编译器 gcc-4.4.7通过yum安装 rpm -qa | grep gcc gcc ...

  5. 【LeetCode刷题Java版】Reverse Words in a String

    Given an input string, reverse the string word by word. For example, Given s = "the sky is blue ...

  6. 99_leetcode_Best Time to Buy and sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  7. easyUI里的checkbox编辑

    数据源如果有布尔值,那么在UI里,最合适的控件应该就是checkbox了. easyUI的datagrid中,列的checkbox酱紫设置: {field:'status',title:'Status ...

  8. 2016/1/14 java生成指定范围的随机数

    java生成指定范围的随机数 package edu.sjtu.erplab.io; import java.util.Random; public class RandomTest { public ...

  9. C++中UINT32和INT32以及int,BOOL和bool的差别

    在AndroidHAL层开发中,编写C++代码的时候.遇到了数据类型的困扰.经过查找资料,总结例如以下: 1.UNIT32和int以及INT32的差别: (1).int默认是signed int.也就 ...

  10. ios34---GDC,dispatch_once

    // // ViewController.m // 09-掌握-GCD常用函数 // // Created by xiaomage on 16/2/18. // Copyright © 2016年 小 ...