python第一百零九天---Django 4
阿新 • • 發佈:2017-08-22
超時 display form 完成 save blog username back use
session :
1. Session
基於Cookie做用戶驗證時:敏感信息不適合放在cookie中
a. Session原理
Cookie是保存在用戶瀏覽器端的鍵值對
Session是保存在服務器端的鍵值對:
保存在數據庫
使用session 前需要 執行
--Python manage.py makemigrations
--python manage.py migrate
保存在內存中的形式:
‘隨機字符串‘:{
‘username‘: ‘....‘,
‘loging‘: ‘....‘,
....
}
b. Cookie和Session對比
c. Session配置(缺少cache)
d. 示例:實現兩周自動登陸
- request.session.set_expiry(60*10)
- SESSION_SAVE_EVERY_REQUEST = True
PS: cookie中不設置超時時間,則表示關閉瀏覽器自動清除
- session依賴於cookie
- 服務器session
request.session.get()#獲取
request.session[x] = x
request.session.clear()
- 引擎配置
1 CACHES = { 2 ‘default‘: { 3 ‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘, 4 ‘LOCATION‘: os.path.join(BASE_DIR,‘cache‘) 5 } 6 } 7 SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ # 引擎(默認)#保存在數據庫中View Code8 9 SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘ #在緩存中 10 11 SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ #在文件中 12 13 SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘ #緩存加數據庫 14 15 SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies‘ #加密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過期(默認) # set_cookie(‘k‘,123) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之後才保存(默認)
session 操作
1. 獲取session中的值
request.session[‘key‘] #獲取不到會報錯 request.session.get(‘key‘,None)#獲取不到返回None
2. 設置session中的值
request.session[‘key‘]=123# 沒有創建 有則替換 request.session.setdefault(‘key‘,123)#存在則不替換
刪除:
del request.session[‘key‘]
3. 所有 鍵 值 鍵值對
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的隨機字符串 在數據庫中是否存在 requset.session.exists(‘session_key‘)#request.session.get(‘key‘,None)#包含了 #刪除 用戶session的隨機字符串 及對應的 鍵值 requset.session.delete(‘session_key‘) request.session.clear()#註銷使用
#設置超時時間 :
request.session.set_expiry(value) * 如果valus為整數 ,session會在秒數後失效 * 如果valus為datatime或timedelta ,session會在這個時間後失效 * 如果valus為0 ,session會在關閉瀏覽器後失效 * 如果valus為0 ,session會在關閉瀏覽器後失效
#################################### CSRF #########################################
CSRF:
a. CSRF原理
{%csrf_token%}#前端生成一個隨機字符串
--在表單中 和COOKIS 中都有存在 但不一樣
django為用戶實現防止跨站請求偽造的功能,
通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。
而對於django中設置防跨站請求偽造功能有分為全局和局部。
全局
--在全局發送POST數據時,需要 csrf_token
局部
[email protected]_protect,為當前函數強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件。
[email protected]_exempt,取消當前函數防跨站請求偽造功能,即便settings中設置了全局中間件。
註:from django.views.decorators.csrf import csrf_exempt,csrf_protect
b. 無CSRF時存在隱患
c. Form提交 (CSRF)
<form>
{%csrf_token%}
</form>
d. Ajax提交 (CSRF)
CSRF請求頭 X-CSRFToken (不能有下劃線)
示例:
$(function(){ // $.ajaxSetup({//當前所有ajax發送 全局 beforeSend: function(xhr,settings){//發送ajax前 先執行這個函數 xhr.setRequestHeader(‘X-CSRFtoken‘, $.cookie(‘csrftoken‘)); } }); $(‘#btn1‘).click(function () { $.ajax({ url: ‘/login/‘, type:"GET", data: {‘user‘: ‘root‘, ‘pwd‘: ‘123‘}, // headers: {‘X-CSRFtoken‘: $.cookie(‘csrftoken‘)}, success:function(arg){ } }) }); })
python第一百零九天---Django 4