<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Worth Waiting For

      cookie和session

      一、cookie和session的介紹

      cookie不屬于http協(xié)議范圍,由于http協(xié)議無法保持狀態(tài),但實際情況,我們卻又需要“保持狀態(tài)”,因此cookie就是在這樣一個場景下誕生。

      cookie的工作原理是:由服務器產(chǎn)生內容,瀏覽器收到請求后保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能通過cookie的內容來判斷這個是“誰”了。

      cookie雖然在一定程度上解決了“保持狀態(tài)”的需求,但是由于cookie本身最大支持4096字節(jié),以及cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節(jié),并且他保存在服務器,有較高的安全性。這就是session。

      問題來了,基于http協(xié)議的無狀態(tài)特征,服務器根本就不知道訪問者是“誰”。那么上述的cookie就起到橋接的作用。

      我們可以給每個客戶端的cookie分配一個唯一的id,這樣用戶在訪問時,通過cookie,服務器就知道來的人是“誰”。然后我們再根據(jù)不同的cookie的id,在服務器上保存一段時間的私密資料,如“賬號密碼”等等。

      總結而言:cookie彌補了http無狀態(tài)的不足,讓服務器知道來的人是“誰”;但是cookie以文本的形式保存在本地,自身安全性較差;所以我們就通過cookie識別不同的用戶,對應的在session里保存私密的信息以及超過4096字節(jié)的文本。

      另外,上述所說的cookie和session其實是共通性的東西,不限于語言和框架

      二、登錄應用原理

      前幾節(jié)的介紹中我們已經(jīng)有能力制作一個登陸頁面,在驗證了用戶名和密碼的正確性后跳轉到后臺的頁面。但是測試后也發(fā)現(xiàn),如果繞過登陸頁面。直接輸入后臺的url地址也可以直接訪問的。這個顯然是不合理的。其實我們缺失的就是cookie和session配合的驗證。有了這個驗證過程,我們就可以實現(xiàn)和其他網(wǎng)站一樣必須登錄才能進入后臺頁面了。

            先說一下這種認證的機制。每當我們使用一款瀏覽器訪問一個登陸頁面的時候,一旦我們通過了認證。服務器端就會發(fā)送一組隨機唯一的字符串(假設是123abc)到瀏覽器端,這個被存儲在瀏覽端的東西就叫cookie。而服務器端也會自己存儲一下用戶當前的狀態(tài),比如login=true,username=hahaha之類的用戶信息。但是這種存儲是以字典形式存儲的,字典的唯一key就是剛才發(fā)給用戶的唯一的cookie值。那么如果在服務器端查看session信息的話,理論上就會看到如下樣子的字典

      {'123abc':{'login':true,'username:hahaha'}}

      因為每個cookie都是唯一的,所以我們在電腦上換個瀏覽器再登陸同一個網(wǎng)站也需要再次驗證。那么為什么說我們只是理論上看到這樣子的字典呢?因為處于安全性的考慮,其實對于上面那個大字典不光key值123abc是被加密的,value值{'login':true,'username:hahaha'}在服務器端也是一樣被加密的。所以我們服務器上就算打開session信息看到的也是類似與以下樣子的東西

      {'123abc':dasdasdasd1231231da1231231}

      三、cookie的簡單使用

      1、獲取Cookie

      request.COOKIES.get("islogin",None)  #如果有就獲取,沒有就默認為none

      2、設置Cookie

        obj = redirect("/index/")
        obj.set_cookie("islogin",True)  #設置cookie值,注意這里的參數(shù),一個是鍵,一個是值
        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里面已經(jīng)有cookie了

      urls.py

      1 from app01 import views
      2 urlpatterns = [
      3     url(r'^admin/', admin.site.urls),
      4     url(r'^login/', views.login),
      5     url(r'^index/', views.index),
      6 ]

      views.py

       1 from django.shortcuts import render,redirect,HttpResponse
       2 from app01 import models
       3 # Create your views here.
       4 def login(request):
       5     if request.method=="POST":
       6         print("所有請求數(shù)據(jù)",request.POST)
       7         username = request.POST.get("username")
       8         password = request.POST.get("password")
       9         # 查看數(shù)據(jù)庫中的用戶名和密碼,對比用戶輸入的是否是數(shù)據(jù)庫中的值
      10         ret = models.UserInfo.objects.filter(username=username,password=password)
      11         if ret:  #如果用戶名和密碼都正確,則登錄成功
      12             print(request.COOKIES)  #{'csrftoken': '1EaTcdQlxdwtR0eXu4uDqEHElEpOlDRJoSAd7TfA7cBDxAyxADVPbIKaZk6J0DVB'}
      13             # 由于http協(xié)議是無狀態(tài)的,你這次登錄完就不知道是誰登錄了,當別人知道你的主頁url,就都可以登錄了。那樣就沒有隱私了
      14             # 這就得用到cookie了
      15             obj = redirect("/index/")
      16             obj.set_cookie("islogin",True)  #設置cookie值,注意這里的參數(shù),一個是鍵,一個是值
      17             obj.set_cookie("haiyan","344",20)  #20代表過期時間
      18             obj.set_cookie("username", username)
      19             return obj
      20         else:
      21             return render(request,"login.html")
      22     else:
      23         return render(request,"login.html")
      24 def index(request):
      25     is_login = request.COOKIES.get("islogin",None)  #得到cookie,有就得到,沒有就得到none
      26     if is_login:
      27         username = request.COOKIES.get("username")
      28         print(username)
      29         return render(request,"index.html",{"username":username})
      30     else:  #如果沒有拿到值,就一直在登錄頁面就進不去
      31         return redirect("/login/")
      View Code

      models.py

      1 class UserInfo(models.Model):
      2     username =models.CharField(max_length=32)
      3     password =models.CharField(max_length=32)

      login.html

       1 <!DOCTYPE html>
       2 <html lang="en">
       3 <head>
       4     <meta charset="UTF-8">
       5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
       6     <meta name="viewport" content="width=device-width">
       7     <title>用戶登錄</title>
       8     <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
       9     <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
      10     <style>
      11         .c1{
      12             margin-top: 100px;
      13         }
      14         .btn{
      15             width: 130px;
      16         }
      17         .c2{
      18             margin-left: 40px;
      19         }
      20     </style>
      21 </head>
      22 <body>
      23 <div class="container">
      24     <div class="row">
      25         <div class="c1 col-md-5 col-md-offset-3">
      26             <form class="form-horizontal" action="/login/" method="post" novalidate>
      27                 {% csrf_token %}
      28                 <div class="form-group">
      29                     <label for="username" class="col-sm-2 control-label">用戶名</label>
      30                     <div class="col-sm-10">
      31                         <input type="email" class="form-control" id="username" placeholder="Email" name="username">
      32                     </div>
      33                 </div>
      34                 <div class="form-group">
      35                     <label for="password" class="col-sm-2 control-label">密碼</label>
      36                     <div class="col-sm-10">
      37                         <input type="password" class="form-control" name="password" id="password"
      38                                placeholder="Password">
      39                     </div>
      40                 </div>
      41                 <div class="form-group">
      42                     <div class="col-sm-offset-2 col-sm-10">
      43                         <button type="submit" class="btn btn-primary">登錄</button>
      44                         <button type="submit" class="btn btn-success c2">注冊</button>
      45                     </div>
      46                 </div>
      47             </form>
      48         </div>
      49     </div>
      50 </div>
      51 
      52 </body>
      53 </html>
      View Code

      index.html

       1 <!DOCTYPE html>
       2 <html lang="en">
       3 <head>
       4     <meta charset="UTF-8">
       5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
       6     <meta name="viewport" content="width=device-width">
       7     <title>Title</title>
       8 </head>
       9 <body>
      10 <h1>hello{{ username }}</h1>
      11 </body>
      12 </html>

      cookie存儲到客戶端

      優(yōu)點:數(shù)據(jù)存儲在客戶端。減輕服務端的壓力,提高網(wǎng)站的性能

      缺點:安全性不高,在客戶端很容易被查看或破解用戶會話信息

      四、session的簡單使用

      1、基本操作(需要掌握的)

      復制代碼
      1、設置session值
          request.session["session_name"]="admin"
      2、獲取session值
          session_name = request.session("session_name")
      3、刪除session值
          del request.session["session_name"]  刪除一組鍵值對
          request.session.flush()   刪除一條記錄
      4、檢測是否操作session值
          if "session_name"  is request.session:
      復制代碼

       

      其他操作

      復制代碼
      5、get(key, default=None)
       
      fav_color = request.session.get('fav_color', 'red')
       
      6、pop(key)
       
      fav_color = request.session.pop('fav_color')
       
      7、keys()
       
      8、items()
       
      9、setdefault()
       
      10、flush() 刪除當前的會話數(shù)據(jù)并刪除會話的Cookie。
                  這用于確保前面的會話數(shù)據(jù)不可以再次被用戶的瀏覽器訪問
                  例如,django.contrib.auth.logout() 函數(shù)中就會調用它。
       
       
      11 用戶session的隨機字符串
              request.session.session_key
        
              # 將所有Session失效日期小于當前日期的數(shù)據(jù)刪除
              request.session.clear_expired()
        
              # 檢查 用戶session的隨機字符串 在數(shù)據(jù)庫中是否
              request.session.exists("session_key")
        
              # 刪除當前用戶的所有Session數(shù)據(jù)
              request.session.delete("session_key")
        
              request.session.set_expiry(value)
                  * 如果value是個整數(shù),session會在些秒數(shù)后失效。
                  * 如果value是個datatime或timedelta,session就會在這個時間后失效。
                  * 如果value是0,用戶關閉瀏覽器session就會失效。
                  * 如果value是None,session會依賴全局session失效策略。
      復制代碼

      2、流程解析圖

      由于cookie會把所有的信息都保存在客戶端,也就是瀏覽器上,這樣會導致不安全,所以引用了session,但是只是單單的session也不好用,必須session和cookie配合這去用。

      session會把信息保存在服務端。

      session原理分析流程:

      {"sessionID":"dfhasdjfhkjlcn4352kjdsfhkjsd"}

      if  post:

        request.session["is_login"]=True

        request.session["user"]=username

        return redirect("/index/”)

      Django會做三件事:

        1、創(chuàng)建隨機字符串。假如s="sdgsdfg4565dfgsdfgsdf" 

        2、 在django-session表中,添加一條記錄

          django-session有三個字段,分別是:session_key,session_data,expire_data

            SQL: 語句: insert into django-session values (s,"{"IS_LOGON":True,"USER":egon}",12321)

        3、給瀏覽器設置sessionID:  obj.set_cookie("sessionID",s)  

      執(zhí)行完之后重定向:

      /home/ ----> {"sessionID":"fasdlkfjsakdl324ada2adhdjlka99"}

      request.session.get("IS_LOGON",None)

      在django-session表中,進行查詢:

      s=requset.COOKIE.get("sessionID")
      select session-data from django-session where session-key=s

      3、示例

      views.py

       1 def log_in(request):
       2 
       3     if request.method=="POST":
       4         username=request.POST['user']
       5         password=request.POST['pwd']
       6 
       7         user=UserInfo.objects.filter(username=username,password=password)
       8 
       9         if user:
      10             #設置session內部的字典內容
      11             request.session['is_login']='true'
      12             request.session['username']=username
      13 
      14             #登錄成功就將url重定向到后臺的url
      15             return redirect('/backend/')
      16 
      17     #登錄不成功或第一訪問就停留在登錄頁面
      18     return render(request,'login.html')
      19 
      20 
      21 
      22 
      23 def backend(request):
      24     print(request.session,"------cookie")
      25     print(request.COOKIES,'-------session')
      26     """
      27     這里必須用讀取字典的get()方法把is_login的value缺省設置為False,
      28     當用戶訪問backend這個url先嘗試獲取這個瀏覽器對應的session中的
      29     is_login的值。如果對方登錄成功的話,在login里就已經(jīng)把is_login
      30     的值修改為了True,反之這個值就是False的
      31     """
      32 
      33     is_login=request.session.get('is_login',False)
      34     #如果為真,就說明用戶是正常登陸的
      35     if is_login:
      36         #獲取字典的內容并傳入頁面文件
      37         cookie_content=request.COOKIES
      38         session_content=request.session
      39 
      40         username=request.session['username']
      41 
      42         return render(request,'backend.html',locals())
      43     else:
      44         """
      45         如果訪問的時候沒有攜帶正確的session,
      46         就直接被重定向url回login頁面
      47         """
      48         return redirect('/login/')
      49 
      50 
      51 
      52 def log_out(request):
      53     """
      54     直接通過request.session['is_login']回去返回的時候,
      55     如果is_login對應的value值不存在會導致程序異常。所以
      56     需要做異常處理
      57     """
      58     try:
      59         #刪除is_login對應的value值
      60         del request.session['is_login']
      61         
      62         # OR---->request.session.flush() # 刪除django-session表中的對應一行記錄
      63 
      64     except KeyError:
      65         pass
      66     #點擊注銷之后,直接重定向回登錄頁面
      67     return redirect('/login/')
      View Code

      templates

       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 
      10 <form action="/login/" method="post">
      11     <p>用戶名: <input type="text" name="user"></p>
      12     <p>密碼: <input type="password" name="pwd"></p>
      13     <p><input type="submit"></p>
      14 </form>
      15 
      16 
      17 </body>
      18 </html>
      19 
      20 
      21 ===================================backend.html==================
      22 
      23 <!DOCTYPE html>
      24 <html lang="en">
      25 <head>
      26     <meta charset="UTF-8">
      27     <title>Title</title>
      28 </head>
      29 <body>
      30 
      31 <h3>hello {{ username }}</h3>
      32 <a href="/logout/">注銷</a>
      33 
      34 </body>
      35 </html>
      View Code

      4、session存儲的相關配置

       (1)默認的是數(shù)據(jù)庫配置:        

      15 Django默認支持Session,并且默認是將Session數(shù)據(jù)存儲在數(shù)據(jù)庫中,即:django_session 表中。
      16   
      17 a. 配置 settings.py
      18   
      19     SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認)
      20       
      21     SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
      22     SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路徑(默認)
      23     SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默認)
      24     SESSION_COOKIE_SECURE = False                            # 是否Https傳輸cookie(默認)
      25     SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http傳輸(默認)
      26     SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默認)
      27     SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否關閉瀏覽器使得Session過期(默認)
      28     SESSION_SAVE_EVERY_REQUEST = False 

      (2)緩存配置

       1 a. 配置 settings.py
       2   
       3     SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
       4     SESSION_CACHE_ALIAS = 'default'                            # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置
       5   
       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,默認修改之后才保存

      (3)文件配置

      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,默認修改之后才保存
      View Code

       

      posted on 2018-03-23 22:50  WorthWaitingFor  閱讀(199)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 广东少妇大战黑人34厘米视频| 亚洲免费观看一区二区三区| 国产线播放免费人成视频播放| 拍真实国产伦偷精品| 18禁动漫一区二区三区| 极品尤物被啪到呻吟喷水| 国产日韩成人内射视频| 日韩精品一区二区三区蜜臀| 午夜射精日本三级| 平罗县| 日产中文字幕在线精品一区| 无套内射视频囯产| 墨玉县| 国产女同一区二区在线| 免费无码成人AV在线播放不卡| 土默特右旗| 人妻少妇精品无码专区二区 | 国内熟妇人妻色在线三级| 日韩中文字幕免费在线观看| 国产免费高清69式视频在线观看| 九九热在线观看精品视频| 99蜜桃在线观看免费视频网站| 九九热精品视频在线免费| 日本高清中文字幕免费一区二区| 97se亚洲国产综合自在线观看| 日韩精品一区二区都可以| 亚洲 制服 丝袜 无码| 亚洲夂夂婷婷色拍ww47| 91精品国产老熟女在线| 色欲国产精品一区成人精品| 欧美一区二区三区久久综合| 性动态图无遮挡试看30秒| 久久精品国产字幕高潮| 99RE6在线观看国产精品| 国产精品乱人伦一区二区| 亚洲中文久久久久久精品国产| 国产漂亮白嫩美女在线观看| 麻豆国产va免费精品高清在线| 国产一区国产精品自拍| 久热这里只有精品视频六| 国产一区二区三区在线观看免费|