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是存儲在資料庫中的
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