Session:
session 依賴於cookie
流程: 用戶登陸之後,客戶端自動生成一個隨機字符串,發送給服務器端,服務器端將隨機字符串以及敏感信息保存在數據庫裏,cookie 保存隨機字符串 session 保存所有信息
基於cookie 做用戶驗證時: 敏感信息不適合存放在cookie 中, 但優點是: 把存儲數據的壓力放在客戶端,服務端壓力小了
Session 原理:
cookie 是保存在用戶瀏覽器端的鍵值對
session 是保存在服務端的鍵值對
在做session 之前必須得先執行 python manage.py makemigrations 和 python manage.py migrate
session 默認的超時時間爲2周 默認存儲在數據庫裏面
session超時實例
from django.shortcuts import render,redirect,HttpResponse from django.views import View from pro1 import models # Create your views here. class login(View): def get(self,request,**kwargs): return render(request, "login.html") def post(self,request): user = request.POST.get('username') pwd = request.POST.get('password') if models.Usersinfo.objects.filter(username=user,password=pwd).first(): request.session['username'] = user # 設置session值 request.session['is_login'] = True if request.POST.get('rmb',None) == '1': # 超時時間 request.session.set_expiry(10) # print(request.POST.get('rmb',None)) return redirect('/index') else: return render(request,'login.html') class index(View): def get(self,request): if request.session.get('is_login',None): return render(request,'index.html',{'username': request.session['username']}) else: return redirect('/login') class logout(View): def get(self,request): request.session.clear() return redirect('/login')
login.html
<div> <form action="/login" method="post"> <p><span>用戶名:</span><input type="text" placeholder="username" name="username"></p> <p><span>密碼:</span><input type="password" placeholder="password" name="password"></p> <p><input type="submit" value="提交"><input type="checkbox" name="rmb" value="1">10秒免登錄</p> </form> </div>
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>歡迎登錄: {{ username }},{{ request.session.username }}</h1> <a href="/logout">註銷</a> </body> </html>
request.session.set_expiry(value) 設置超時時間
*
如果value是個整數,session會在些秒數後失效。
*
如果value是個datatime或timedelta,session就會在這個時間後失效。
*
如果value是
0
,用戶關閉瀏覽器session就會失效。
*
如果value是
None
,session會依賴全局session失效策略。
默認值:
SESSION_COOKIE_NAME = "sessionid" # Session 的cookie保存在瀏覽器上時的key
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周) (默認) set_cookie('k',123)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session 默認修改之後才保存(默認)
如果想頁面在放置時間超過一定的時間才生效,需要在settings.py 裏面設置:
session_save_every_request=True
使用:
獲取session數據:
request.session['k1'] 如果沒有數據會報錯
request.session.get('k1',None)
設置session
request.session['k1'] = 123
request.session.setdefault('k1',123) 存在則不設置
刪除session
del request.session['k1']
所有鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.iteervalues()
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')
session 存儲位置:
默認保存在數據庫裏
Django默認支持Session,並且默認是將Session數據存儲在數據庫中,即:django_session 表中。 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,默認修改之後才保存(默認)
支持保存在緩存 緩存爲memcache django 不支持redis,但是有redis的相關插件
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置 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
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 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
數據庫用於做持久化,緩存用於提高效率 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
加密cookie Session
配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
session 驗證:
def login(func): def wrap(request, *args, **kwargs): # 如果未登陸,跳轉到指定頁面 if request.path == '/test/': return redirect('http://www.baidu.com') return func(request, *args, **kwargs) return wrap
CSRF:
django爲用戶實現防止跨站請求僞造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。
csrf 原理 使用隨機字符串 csrf_token
在頁面上如果要顯示: ` csrf_token ` 隱藏: {% csrf_token %}
****注: 請求頭不能出現下劃線 X-CSRFtoken
全局: 中間件 在settings.py 中 設置 django.middleware.csrf.CsrfViewMiddleware
局部:
* @csrf_protect 爲當前函數強制設置防跨站請求僞造功能,即便settings中沒有設置全局中間件。
* @csrf_exempt 取消當前函數防跨站請求僞造功能,即便settings中設置了全局中間件。
注: from django.views.decorators.csrf import csrf_exempt,csrf_protect
應用:
1、普通表單 Form
veiw中設置返回值: return render_to_response('Account/Login.html',data,context_instance=RequestContext(request)) 或者 return render(request, 'xxx.html', data) html中設置Token: {% csrf_token %}
2、Ajax
from django.template.context import RequestContext # Create your views here. def test(request): if request.method == 'POST': print request.POST return HttpResponse('ok') return render_to_response('app01/test.html',context_instance=RequestContext(request))
html
全局配置csrf: $(function(){ $.ajaxSetup({ beforeSend: function(xhr,settings){ xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken')) } }); $('#btn1').click(function(){ ***** }) }) 單個ajax $(function(){ $('#btn').click(function(){ $.ajax({ url: "/login/", type: "POST", data: {"user": 'root',"pwd": '123'} headers: {'X-CSRFtoken': $.cookie('csrftoken')}, success: function(arg){ } }) }) })