zoukankan      html  css  js  c++  java
  • pyhton框架Django之cookie和session

    一,cookie和session的理解

    cookies 是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies。它保存在浏览器下的某个文件夹下。保存在浏览器端的键值对可以利用做登录

    浏览器下的cookei:

    Session  

      Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。

      Session依赖于Cookie,如果浏览器不能保存cooki那么session就失效了。因为它需要浏览器的cooki值去session里做对比。session就是用来在服务器端保存用户的会话状态。

    区别:

    1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    考虑到安全应当使用session。

    3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    考虑到减轻服务器性能方面,应当使用COOKIE。

    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

    二,cookei

      当你浏览京东或者天猫的时候,登录成功以后(一次请求),想查看我的订单(另一次请求),但是http是短连接(连接一次就断开),服务器该如何判断你是否登录呢?所以在服务器端需要有一个保存用户状态地方(session),客户端登录成功后,服务端向客户端浏览器写入一段字符串(标识),客户端每次访问的时候需要带上这个标识,服务端根据这个标识就能获取客户端信息了。客户端保存这个标识就叫做cookie。

    构成:

    1、自动生成一段字符串

    2、将字符串发送到客户端的浏览器(cookie),同时把这段字符串当做key放在session里。(可以理解为session就是一个字典)

    3、在用户的session对应的value里设置任意值(字典里面可以继续套字典)

    cookie的简单使用

    1、获取Cookie

    request.COOKIES.get("islogin",None) #如果有就获取,没有就默认为none

    2、设置Cookie

      obj = redirect("/index/")
      obj.set_cookie("islogin",True)  #设置cookie值,注意这里的参数,一个是键,一个是值
      obj.set_cookie("haiyan","344",20)  #20代表过期时间
      obj.set_cookie("username", username)

    3、删除Cookie

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

     登录认证示例:

    需要知道几点

    一共有三次请求
      注意:form表单的action走的路径还是/login/
         第一次请求:url:http://127.0.0.1:8080/login get请求
           第一次请求:url:http://127.0.0.1:8080/login post请求 user pasw
           第一次请求:url:http://127.0.0.1:8080/index post请求 携带着cookie的了
           所以在index页面中就会取到cookie,因为这是的index里面已经有cookie了

    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login/', views.login),
        url(r'^index/', views.index),
    ]
    urls.py
    from django.shortcuts import render,redirect,HttpResponse
    from app01 import models
    # Create your views here.
    def login(request):
        if request.method=="POST":
            print("所有请求数据",request.POST)
            username = request.POST.get("username")
            password = request.POST.get("password")
            # 查看数据库中的用户名和密码,对比用户输入的是否是数据库中的值
            ret = models.UserInfo.objects.filter(username=username,password=password)
            if ret:  #如果用户名和密码都正确,则登录成功
                print(request.COOKIES)  #{'csrftoken': '1EaTcdQlxdwtR0eXu4uDqEHElEpOlDRJoSAd7TfA7cBDxAyxADVPbIKaZk6J0DVB'}
                # 由于http协议是无状态的,你这次登录完就不知道是谁登录了,当别人知道你的主页url,就都可以登录了。那样就没有隐私了
                # 这就得用到cookie了
                obj = redirect("/index/")
                obj.set_cookie("islogin",True)  #设置cookie值,注意这里的参数,一个是键,一个是值
                obj.set_cookie("haiyan","344",20)  #20代表过期时间
                obj.set_cookie("username", username)
                return obj
            else:
                return render(request,"login.html")
        else:
            return render(request,"login.html")
    def index(request):
        is_login = request.COOKIES.get("islogin",None)  #得到cookie,有就得到,没有就得到none
        if is_login:
            username = request.COOKIES.get("username")
            print(username)
            return render(request,"index.html",{"username":username})
        else:  #如果没有拿到值,就一直在登录页面就进不去
            return redirect("/login/")
    views.py
    class UserInfo(models.Model):
        username =models.CharField(max_length=32)
        password =models.CharField(max_length=32)
    models.py
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width">
        <title>用户登录</title>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
        <style>
            .c1{
                margin-top: 100px;
            }
            .btn{
                width: 130px;
            }
            .c2{
                margin-left: 40px;
            }
        </style>
    </head>
    <body>
    <div class="container">
        <div class="row">
            <div class="c1 col-md-5 col-md-offset-3">
                <form class="form-horizontal" action="/login/" method="post" novalidate>
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="username" class="col-sm-2 control-label">用户名</label>
                        <div class="col-sm-10">
                            <input type="email" class="form-control" id="username" placeholder="Email" name="username">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="password" class="col-sm-2 control-label">密码</label>
                        <div class="col-sm-10">
                            <input type="password" class="form-control" name="password" id="password"
                                   placeholder="Password">
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" class="btn btn-primary">登录</button>
                            <button type="submit" class="btn btn-success c2">注册</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
     
    </body>
    </html>
    login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width">
        <title>Title</title>
    </head>
    <body>
    <h1>hello{{ username }}</h1>
    </body>
    </html>
    index.html
    def login(request):
        pass
        message = ""
        v = request.session
        print(type(v))
        #from django.contrib.sessions.backends.db import SessionStore
        if request.method == "POST":
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
    
            c = models.Administrator.objects.filter(username=user, password=pwd).count()
            if c:
                request.session['is_login'] = True
                request.session['username'] = user
                rep = redirect('/index.html')
                return rep
            else:
                message = "用户名或密码错误"
        obj = render(request,'login.html', {'msg': message})
        return obj
    
    /*************装饰器auth************/
    def auth(func):
        def inner(request, *args, **kwargs):
            is_login = request.session.get('is_login')
            if is_login:
                return func(request, *args, **kwargs)
            else:
                return redirect('/login.html')
        return inner
    
    @auth
    def index(request):
        current_user = request.session.get('username')
        return render(request, 'index.html',{'username': current_user})
    利用装饰器写的登录的view.py

    三,session

    Django中操作session:

      获取session:request.session[key]     request.session.get(key)

      设置session:reqeust.session[key] = value

      删除session:del request[key]   request.session.clear()

    一段简单的Django中实现session的代码,判断用户是否已经成功登录:

    def login(request):
        if request.method =='POST':
            username = request.POST.get('username')
            pwd = request.POST.get('pwd')
            if username =='lisi' and pwd == '12345':
                request.session['IS_LOGIN'] = True       设置session
                return redirect('/app01/home/')
    
        return render(request,'login.html')
    
    def home(request):
        is_login = request.session.get('IS_LOGIN',False)   获取session里的值
        if is_login:
            return HttpResponse('order')
        else:
            return redirect('/app01/login/')
    View Code

    session配置文件:   

    数据库配置

    #settings.py配置文件
    
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'  # 引擎
    SESSION_FILE_PATH = 文件路径  # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
    session不仅可以保存在数据库里,
    数据库(默认)
    缓存(memchache、redis)
    文件
    缓存+数据库
    加密cookie
    
    SESSION_COOKIE_NAME="zhanggen"  # 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 = 600000  # Session的cookie失效日期(2周) 默认1209600秒
    SESSION_EXPIRE_AT_BROWSER_CLOSE =True  # 是否关闭浏览器使得Session过期
    
    SESSION_SAVE_EVERY_REQUEST = True  
    #如果你设置了session的过期时间 30分钟后,这个参数是False30分钟过后,session准时失效
    #如果设置 True,在30分钟期间有请求服务端,就不会过期!(为什么逛一晚上淘宝,也不会登出,但是不浏览器不刷新了就会自动登出)

     session保存位置配置

    缓存 redis memcache
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    
    浏览器cook(相当于没有用session,又把敏感信息保存到客户端了)
     SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

    缓存配置

    #配置 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,默认修改之后才保存

    文件配置

    #配置 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,默认修改之后才保存

    博客链接:http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465

    #Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
       
    #配置 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,默认修改之后才保存(默认)
  • 相关阅读:
    视频智能分析系统EasyCVR视频流媒体安防监控云服务实现城市视频智能化应用
    Windows/Android/iOS平台H265编码视频播放器EasyPlayerRTSP中socket选项之keepalive设置介绍
    【解决方案】人脸识别/车牌识别RTSP/GB28181/SDK/Ehome协议视频平台EasyCVR搭建美丽乡村视频监控系统方案
    【操作说明】新版网络穿透+云端组网+远程运维+视频流拉转推平台EasyNTS上云网关管理平台如何安装?
    Windows/Android/iOS平台H265编码视频播放器EasyPlayerPro支持高码率视频播放和D3D画面旋转代码参考
    【操作说明】人脸识别/车牌识别系统视频智能分析平台EasyCVR如何配置开启HTTPS协议?
    程序员们 不要想一辈子靠技术混饭吃
    jsonObject的使用
    程序员们 不要想一辈子靠技术混饭吃
    从 iBatis 到 MyBatis
  • 原文地址:https://www.cnblogs.com/lanyinhao/p/9374970.html
Copyright © 2011-2022 走看看