(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表中,也能夠存在一個文件當中,或者緩存當中,這個取決於你的設置.
django中的session配置:html
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相關設置
登陸校驗實例:數據庫
from django.shortcuts import render,redirect,HttpResponse # Create your views here. def login(request): err_msg = "" if request.method == "POST": username = request.POST.get("username") pwd = request.POST.get("pwd") if username == "alex" and pwd == "123": print(request.get_full_path()) path = request.GET.get("retuen","/index/") ret = redirect(path) # ret.set_cookie("is_login","True") request.session["is_login"] = "True" return ret else: err_msg = "用戶名或密碼錯誤" return render(request,"login.html",{"err_msg":err_msg}) def aaa(fn): def inner(request,*args,**kwargs): return_path = request.path_info # if request.COOKIES.get("is_login","") == "True": if request.session.get("is_login","") == "True": ret = fn(request,*args,**kwargs) return ret else: return redirect("/login/?retuen={}".format(return_path)) return inner @aaa def index(request): return render(request,"index.html") @aaa def home(request): return HttpResponse("這是home頁面")
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^index/', views.index), url(r'^home/', views.home), ]
</head> <body> <form action="" method="post"> {% csrf_token %} <p>用戶名:<input type="text" name="username"></p> <p>密碼:<input type="password" name="pwd"></p> <button>提交</button> {{ err_msg }} </form> </body> </html>