天天看點

Django學習---cookie和sessioncookieSession

cookie

 用戶端浏覽器上的一個檔案,以鍵值對的形式存儲,如{“user”:“dacehgnzi”}

入門:實作一個簡單的登入功能

views.py:

1 user_info = {
 2     'dachengzi':{'pwd':'123456'},
 3     'root':{'pwd':'555555'},
 4 }
 5 def login(request):
 6     if request.method == 'GET':
 7         return render(request,'login.html')
 8     elif request.method == 'POST':
 9         name = request.POST.get('username')
10         passwd = request.POST.get('passwd')
11         dic = user_info[name]
12         if not dic:
13             return render(request,'login.html')
14         elif dic['pwd'] == passwd:
15             res = redirect('/index/')
16             res.set_cookie('username',name)
17             return res
18         else:
19             return render(request, 'login.html')
20 def index(request):
21     #擷取目前已經登入的使用者
22     v = request.COOKIES.get('username')
23     if not v:
24         return redirect('/login/')
25 
26     return render(request,'index.html',{'current_user':v})      

 想要往浏覽器中添加cookie值,在跳轉的時候set_cookie,想要擷取cookie時就用request.COOKIE.get(''),

擷取cookie值:

  • request.COOKIES獲得所有的cookie
  • request.COOKIES['cookie名稱']
  • request.COOKIES.get('cookie名稱')

往浏覽器中寫cookie:在給使用者傳回内容的時候不僅要把内容傳回給使用者,還要把cookie傳回給使用者

  1.用一個變量,把要跳轉指派過去:response = render(requset,'傳回的html')/redirect('傳回的url')

  2.設定cookie值:response = set_cookie('key','value')設定cookie,關閉浏覽器失效

  3.傳回response:return response

我們來看一下set_cookie函數:

set_cookie(key,value,...)
參數:
        key,              鍵
        value='',         值
        max_age=None,     逾時時間,多少秒之後失效
      
        expires=None,     逾時時間(IE requires expires, so set it if hasn't been already.),具體到某一個時間
          import datetime
       current_date = datetime.datetime.utcnow()
       current_date = current_date + datetime.timedelta(seconds=5)
       response.set_cookie('username',name,expires = current_date)
     path='/',         Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面通路
        domain=None,      Cookie生效的域名
        secure=False,     https傳輸
        httponly=False    隻能http協定傳輸,無法被JavaScript擷取(不是絕對,底層抓包可以擷取到也可以被覆寫)document.cookie:js中擷取cookie      

案例:分頁(通過cookie值設定每頁顯示多少條資料)

我們先下載下傳一個jquery cookie這個js,這樣就可以通過jQuery獲得cookie值,和設定cookie:

html代碼:

<!DOCTYPE html>
<html en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .pagination .page{
            display: inline-block;
            padding:5px;
            background-color: seashell;
            margin:5px;
        }
        .pagination .active{
            background-color: coral;
        }
    </style>
</head>
<body>
    <ul>
        {% for item in li %}
            {% include 'li.html' %}
        {% endfor %}
    </ul>
    <div>
        <select id="page_size" οnchange="changePageSize(this)">
            <option value="10">10</option>
            <option value="20">20</option>
            <option value="30">30</option>
        </select>
    </div>
    <div class="pagination">
        {{ page_str|safe }}
    </div>
    <script src="/static/jquery-1.12.4.js"></script>
    <script src="/static/jquery.cookie.js"></script>
    <script>
        $(function () {
            v = $.cookie('per_page_count')擷取cookie的值
            if(v == undefined){
                v = 10
            }
            $("#page_size").val(v);
        });
        function changePageSize(ths){
            var v = $(ths).val()
            $.cookie('per_page_count',v);設定cookie的值
            location.reload()
        }
    </script>
</body>
</html>      

當然在這裡面,我們也可以通過和django中cookie的一樣的參數去設定url和過期時間

我們是上面的cookie值都是明文的,那我們如果用密文呢?

在django中有一個方法set_signed_cookie()方法,使用了這個方法設定出來的cookie值就是加密的:

#加密,基于salt加密
request.get_signed_cookie('username','kangbazi', default=RAISE_ERROR, salt='asdfasd', max_age=None)
    參數:
        default: 預設值
           salt: 加密鹽
        max_age: 背景控制過期時間
#解密
request.get_signed_cookie('username',salt='asdfasd')      

salt的值要對應上才能解密

Session

cookie的缺點:

  我們js可以擷取然後修改,這時候我們使用者再通路就登入不上了

  如果我們把一些敏感資訊放在cookie中,人家就可以看到。就會造成資訊洩露

是以基于Cookie做使用者驗證的時候不建議把敏感資訊存儲在cookie中

cookie的優點:

  把存儲資料的壓力放在每個人的電腦上,減輕了伺服器的壓力

1.Session原理

cookie是儲存在使用者浏覽器端的鍵值對

session是儲存在伺服器端的鍵值對,session 依賴于 cookie。

  使用者來請求,登入之後給他生成一個随機字元串,在伺服器上儲存,放置一個字典儲存目前使用者的資訊

入門:

views.py:

1 from django.shortcuts import render,HttpResponse,redirect
 2 
 3 # Create your views here.
 4 def login(request):
 5     if request.method == 'GET':
 6         return render(request,'login.html')
 7     elif request.method == 'POST':
 8         user = request.POST.get('user')
 9         pwd = request.POST.get('passwd')
10         if user == 'root' and pwd == '123':
11             #生成随機字元串
12             #寫到使用者浏覽器cookie
13             #儲存的到session中
14             #在随機字元串對應的字典中設定相關的内容
15             request.session['username'] = user
16             request.session['is_login'] =True
17             return redirect('/index/')
18         else:
19             return render(request,'login.html')
20 def index(request):
21     #擷取目前使用者的随機字元串
22     #根據随機字元串擷取對應的資訊
23     if request.session['is_login']:
24         return HttpResponse(request.session['username'])
25     else:
26         return HttpResponse('去登入去')      

首先我們運作的時候要先生成資料庫,makemigrations,migrate,然後再去執行,因為session是存儲在資料庫中的

Django學習---cookie和sessioncookieSession
Django學習---cookie和sessioncookieSession

session操作:

    # 擷取、設定、删除Session中資料
        request.session['k1']沒有就報錯
        request.session.get('k1',None)
        request.session['k1'] = 123
        request.session.setdefault('k1',123) # 存在則不設定
        del request.session['k1']删除k1
 
        # 所有 鍵、值、鍵值對
        request.session.keys()
        request.session.values()
        request.session.items()
        request.session.iterkeys()
        request.session.itervalues()
        request.session.iteritems()
 
 
        # 使用者session的随機字元串
        request.session.session_key
 
        # 将所有Session失效日期小于目前日期的資料删除,把資料庫中超過逾時時間的資料都删除
        request.session.clear_expired()
 
        # 檢查 使用者session的随機字元串 在資料庫中是否
        request.session.exists("session_key")
 
        # 删除目前使用者的所有Session資料
        request.session.delete("session_key")
     # 當登入的使用者點登出的時候就可以用這句 
     request.session.clear()就相當于reqeust.session.delete(request.session.session_key)

     # 在django中預設的逾時時間為兩周,我們可以通過下面的重新設定逾時時間
        request.session.set_expiry(value)
            * 如果value是個整數,session會在些秒數後失效。
            * 如果value是個datatime或timedelta,session就會在這個時間後失效。
            * 如果value是0,使用者關閉浏覽器session就會失效。
            * 如果value是None,session會依賴全局session失效政策。      

 settings.py:

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,預設修改之後才儲存(預設)      

 上面我們的 session 是放置在資料庫中,在django中,還可以把session存放在其他的地方:

  • 資料庫(預設)
  • 緩存
  • 檔案
  • 緩存+資料庫
  • 加密cookie

 放在緩存中:

settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的緩存别名(預設記憶體緩存,也可以是memcache),此處别名依賴緩存的設定      

 放在檔案中:

SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 緩存檔案路徑,如果為None,則使用tempfile子產品擷取一個臨時位址tempfile.gettempdir()     # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T      

 緩存+資料庫Session

資料庫用于做持久化,緩存用于提高效率
 
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎      

加密cookie Session

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎      

轉載于:https://www.cnblogs.com/charles8866/p/8784349.html