關於http連接的本質 已經cookies和session
網絡上的任何交互都是基於socket連接
http 連接響應 close 再次連接 無法確實是否還是xx的連接——無狀態,短連接
以博客園舉例 無狀態和短連接:
for example:
Web應用(網站):
瀏覽器(socket客戶端)運行
2.發送請求
博客園為例子 (socket服務端)
- 監聽自己的ip和端口 { cmd中Ping+網址可在終端拿到(ip) }
While Ture:
3.收到 請求
4.響應
用戶斷開
#################################################
關於cookies和session的總結(ps:不是很全)
1. http協議的無狀態性:
使用cookie:
第一次向服務器發起請求,服務器返回一個cookie給客戶端,
客戶端存儲cookie,當客戶端再次發起請求時攜帶cookie信息給服務器,
服務器接收到cookie信息能夠獲取用戶信息
不使用cookie:
第一次向服務器發起請求,服務器返回一個響應給客戶端
第二次再次向服務器發起請求,服務器仍然不知道是哪一個用戶發起的請求
2. 使用cookie可以彌補這種http請求的無狀態性
1. 客戶端發起請求(包含用戶信息),服務器接收到請求,驗證用戶信息,同時返回響應給客戶端(攜帶cookie)
2. 客戶端接收響應(存儲cookie)
3. 客戶端再次發起請求就會攜帶cookie信息,服務器就能知道是哪個用戶發起的請求了
【註意】:
1. cookie不能跨域傳遞
2. 使用cookie存儲數據的容量是有限的, 不能使用cookie存儲大量文本信息。
一般來說用cookie存儲用戶名, sessionid
不同的瀏覽器, cookie容量不同,最大不會超過4kb
3. 在django中操作cookie
1. 設置cookie
p = HttpResponse()
p.set_cookie(key, value) # 默認過期時間: 瀏覽器關閉時,不是標簽頁關閉
p.set_cookie(key, value, max_age=60) # 單位是秒, 設置過期時間
from django.utils.timezone import make_aware
帶時區的時間日期對象 = make_aware(時間日期對象)
p.set_cookie(key, value, expires=時間日期對象(帶時區))
* 如果同時設置了max_age和expires, 則使用expires的過期時間
2. 刪除cookie
p = HttpResponse()
p.delete_cookie(‘name‘)
3. 獲取cookie
request.COOKIES.get(‘name‘)
POST
GET
FILES
PS:(
cookie是保存在客戶端的(瀏覽器)
cookie在客戶端中分域名保存
發起請求時客戶端自動將當前域名(路勁)下未過期的cookie攜帶上
)
4. session
1. 基於cookie實現
2. 過程:
1. 客戶端發起請求(用戶信息), 服務器接收到請求,
驗證通過, 將用戶信息加密後存儲到session表中,對應著隨機生成的session_id
2. 服務器返回響應, 攜帶cookie, cookie中存儲的是session_id
3. 客戶端接收到響應, 存儲cookie信息到本地瀏覽器中
4. 客戶端再次發起請求, 攜帶cookie信息(session_id),
服務器接收到請求後,通過session_id就能獲取用戶信息
註意: cookie存儲在客戶端(瀏覽器)
session存儲在服務器
5. 在django中操作session
1. 存儲:
request.session[‘key‘] = ‘value‘
同一個用戶,創建多個session鍵值對,在django_session表中只存儲為一條session數據;
session表中的session_key是固定的。
2. 獲取:
request.session[]
request.session.get()
request.session.items()
request.session.keys()
request.session.values()
3. 刪除:
request.session.pop(‘key‘)
4. 清除數據:
request.session.clear() # 清除當前用戶存儲的session鍵值對,session表中的session數據還在
cookie中仍然有session_id的值
request.session.flush() # 註銷;退出登錄;
在session表中刪除當前用戶的整條session數據,
cookie中的session_id也被刪除了
* 同一個客戶端的同一個用戶也可能會產生多條session表中的數據,因為之前的數據都過期了
5. 刪除過期的session
1. 代碼 request.session.clear_expired()
2. 命令行 python manage.py clearsessions
6. 設置過期時間
request.session.set_expiry()
1. 整型參數: 秒
2. 0:瀏覽器關閉
3. None:默認的過期時間,2周
settings.py
TIME_ZONE = ‘Asia/Shanghai‘
USE_TZ = False
關於http連接的本質 已經cookies和session