(1)cookie與session---------->>>>>>>>>>>>>>>>>>>>.>>>>>
1,為什么http協議是無狀態的就可以直接訪問任何頁面.
因為http協議無狀態,所以他誰也不認識,只要你給請求,我就返回頁面.
若要解決這個問題,可以設置cookie與session.
2. cookie
1. cookie是什么?
cookie是服務器讓瀏覽器保存在瀏覽器上一組組鍵值對
Cookie的原理:
cookie的工作原理是:由服務器產生內容,瀏覽器收到請求后保存在本地;
當瀏覽器再次訪問時,瀏覽器會自動帶上Cookie,這樣服務器就能通過Cookie的內容來判斷這個是“誰”了。
2. 特性:
1. 是服務器讓瀏覽器設置的。瀏覽器有權利不設置。
2. 訪問其他頁面的時候攜帶著cookie。
3. 能干什么?
1. 做登錄
2,限制訪問頻率
3.記錄瀏覽習慣
4.簡單的投票
3,為什么瀏覽器屏蔽掉cookie之后就不能登錄???
因為你提交的時候,服務器會讓瀏覽器設置一個cookie,但是你不設置,所以就不讓你登錄.
django中操作cookie
1. 設置cookie
rep = redirect('/index/')
rep.set_cookie(key,value,max_age=1000)
rep.set_signed_cookie(key,value,max_age=1000,salt='') 加鹽方式
參數:
?key, 鍵
?value='', 值
?max_age=None, 超時時間
?expires=None, 超時時間(IE requires expires, so set it if hasn't been already.)
?path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
?domain=None, Cookie生效的域名
?secure=False, https傳輸
?httponly=False 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
2. 獲取cookie
request.COOKIES['key']
request.COOKIES.get('key') ——》推薦的取法
request.get_signed_cookie('key',salt='') 加鹽方式
get_signed_cookie方法的參數:
?default: 默認值
?salt: 加密鹽
?max_age: 后臺控制過期時間
request.method
request.POST ——》POST請求提交的數據 {}
request.GET ——》URL上的參數 /?id=11&name=xx
request.FILES ——》上傳的文件
3. 刪除cookie
rep.delete_cookie('key')
獲取用request,刪除和設置都用response對象操作.
注意:form表單中action="" 什么也別填了,填了有可能出問題,有深坑.
http://127.0.0.1:8000/login/?retuen=/home/ action="/login/"這樣提交的地址其實是/login/,不加的話地址才是/login/?retuen=/home/
4,cookie的缺點???
保存在瀏覽器上不安全;請求的時候發的時候,cookie有長度限制64,如果無限大的話 卡死了就
5,session: 都是request操作的,
session是保存在服務器上的鍵值對,依賴于cookie
django中操作session
1. 設置session
request.session['key'] = value
request.session.setdefault(key,value) ——》 存在就不設置
2. 獲取session
request.session['key']
request.session.get(key,'')
3. 刪除session
request.session.pop(key) ——》 刪除某一個鍵值對
del request.session['key']
request.session.delete() ——》刪除所有的session鍵值對
request.session.flush() ——》刪除所有的session鍵值對.刪除了cookie
4. 設置超時時間
request.session.set_expiry()
5. 清除當前過期的session
request.session.clear_expired()
# 獲取、設置、刪除Session中數據
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在則不設置
del request.session['k1']
# 所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 會話session的key
request.session.session_key
# 將所有Session失效日期小于當前日期的數據刪除
request.session.clear_expired()
# 檢查會話session的key在數據庫中是否存在
request.session.exists("session_key")
# 刪除當前會話的所有Session數據
request.session.delete()
# 刪除當前的會話數據并刪除會話的Cookie。
request.session.flush()
這用于確保前面的會話數據不可以再次被用戶的瀏覽器訪問
例如,django.contrib.auth.logout() 函數中就會調用它。
# 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
* 如果value是個整數,session會在些秒數后失效。
* 如果value是個datatime或timedelta,session就會在這個時間后失效。
* 如果value是0,用戶關閉瀏覽器session就會失效。
* 如果value是None,session會依賴全局session失效策略。
6,流程----->>>>> 瀏覽器首次訪問服務器的時候沒有cookie,然后訪問服務器,服務器會生成一個session_ID字典,字典的值為瀏覽器的數據和cookie(一個隨機字符串),
然后返回session_ID給瀏覽器,下次瀏覽器再來的時候攜帶session_ID訪問服務器,可以唯一找到對應的服務器存儲的session,并且
打開這個字典,并從中取到值做對應校驗,檢驗是否正確能否訪問
注意:一個session對應一個cookie,并且一個瀏覽器對應一個session數據
session存在數據庫中,默認存在django_session表中,也可以存在一個文件當中,或者緩存當中,這個取決于你的設置.
1. 數據庫Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認)
2. 緩存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
4. 緩存+數據庫
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用設置項:
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,默認修改之后才保存(默認)
Django中Session相關設置