05-session-会话跟踪技术
1、session簡介
Django中默認(rèn)支持Session,其內(nèi)部提供了5種類型的Session供開發(fā)者使用:
- 數(shù)據(jù)庫(默認(rèn))
- 緩存
- 文件
- 緩存+數(shù)據(jù)庫
- 加密cookie
?
Session是服務(wù)器端技術(shù),利用這個技術(shù),服務(wù)器在運行時可以 為每一個用戶的瀏覽器創(chuàng)建一個其獨享的session對象,
由于 session為用戶瀏覽器獨享,所以用戶在訪問服務(wù)器的web資源時 ,可以把各自的數(shù)據(jù)放在各自的session中,
當(dāng)用戶再去訪問該服務(wù)器中的其它web資源時,其它web資源再從用戶各自的session中 取出數(shù)據(jù)為用戶服務(wù)。
2、session之保存登錄狀態(tài)信息
1、寫session
?
?
?
2、session讀取
?
?
?
?
?
3、不同瀏覽器,會創(chuàng)建不同的session_id
?
?
?
4、views視圖代碼
def login_session(request):if request.method == "POST":user = request.POST.get("user")pwd = request.POST.get("pwd")# user_obj = UserInfo.objects.filter(username=user, password=pwd) # AttributeError: 'QuerySet' object has no attribute 'username'user_obj = UserInfo.objects.filter(username=user, password=pwd).first()if user_obj:# 設(shè)置sessionrequest.session['is_login'] = Truerequest.session['username'] = user_obj.username"""設(shè)置session步驟1.生成隨機字符串 q4r5q4rfar325432.response.set_cookie("session_id",q4r5q4rfar32543)3.在django-session表創(chuàng)建一條記錄:session-key session-dataq4r5q4rfar32543 {"is_login":True, "username":"alex"}"""return HttpResponse("登錄成功")return render(request, 'login_session.html')def index_session(request):# 獲取sessionis_login = request.session.get("is_login")print("is_login:", is_login) # Trueif not is_login:return redirect("/login_session/")username = request.session.get("username")"""獲取session流程1 request.COOKIE.get("session") # wspn39juwcrrqxs0916ftmlcvyl7c1gg2 django-session表中過濾記錄:在django-session表中創(chuàng)建一條記錄:session-key session-datawspn39juwcrrqxs0916ftmlcvyl7c1gg {"is_login":True, "username":"alex"}obj = django-session.object.filter(session-key=wspn39juwcrrqxs0916ftmlcvyl7c1gg)3 obj.session-data.get("is_login")"""return render(request, "index_session.html", {"username": username}) View Code?
?
?
4、session應(yīng)用之保存上次登錄時間
?
?
?
5、前部分session代碼
modles
from django.db import modelsclass UserInfo(models.Model):username = models.CharField(max_length=32)password = models.CharField(max_length=32)?
主url
from django.contrib import admin from django.urls import path, re_path, includeurlpatterns = [path('admin/', admin.site.urls),re_path(r'^', include(('app01.urls', 'app01'))) ]?
?
url
from django.urls import path, re_path, include from app01 import viewsurlpatterns = [re_path(r'^login_session/$', views.login_session, name='login_session'),re_path(r'^index_session/$', views.index_session, name='index_session'), ]?
?
views
from django.shortcuts import render, HttpResponse, redirectfrom app01.models import UserInfodef login_session(request):if request.method == "POST":user = request.POST.get("user")pwd = request.POST.get("pwd")user_obj = UserInfo.objects.filter(username=user, password=pwd).first()if user_obj:# 設(shè)置sessionrequest.session['is_login'] = Truerequest.session['username'] = user_obj.usernamereturn HttpResponse("登錄成功")return render(request, 'login_session.html')def index_session(request):# 獲取sessionis_login = request.session.get("is_login")print("is_login:", is_login) # Trueif not is_login:return redirect("/login_session/")username = request.session.get("username")last_visit_time = request.session.get("last_visit_time", "") # get到last_time response = render(request, "index_session.html", {"username": username, "last_visit_time": last_visit_time})import datetimenow = datetime.datetime.now().strftime("%Y-%m-%d %X")request.session["last_visit_time"] = now # 設(shè)置時間return response?
?
?
?
模板層
login_session.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><form action="" method="post">{% csrf_token %}username <input type="text" name="user">password <input type="password" name="pwd"><input type="submit" value="登錄"> </form></body> </html>?
?
index_session.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h3>hi {{ username }}</h3> <p>上次登錄時間:{{ last_visit_time }}</p> </body> </html>?
?
5、session的更新操作
?
同一個瀏覽器,后面的session_data 會覆蓋前面的數(shù)據(jù)
?
6、基于session的注銷功能
3、刪除Sessions值del request.session["session_name"] 4、flush()刪除當(dāng)前的會話數(shù)據(jù)并刪除會話的Cookie。這用于確保前面的會話數(shù)據(jù)不可以再次被用戶的瀏覽器訪問 5、get(key, default=None)fav_color = request.session.get('fav_color', 'red')6、pop(key)fav_color = request.session.pop('fav_color')7、keys()8、items()9、setdefault()
logout視圖
def logout(request):# 刪除session值del request.session["is_login"]del request.session["username"]# 刪除全部數(shù)據(jù) request.session.flush()"""刪除session流程1 random_str = request.COOKIE.get("sessionid")2 django-session.objects.filter(session-key=random_str).delete()3 response.delete_cookie("sessionid", random_str)"""return redirect("/login_session/")?
?index_seeion.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h3>hi {{ username }}</h3> <p>上次登錄時間:{{ last_visit_time }}</p> <a href="/logout/">注銷</a> </body> </html>?
?
?
?
7、session的配置參數(shù)
?
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 # 是否關(guān)閉瀏覽器使得Session過期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認(rèn)修改之后才保存
session失效時間15s
?
?
每次訪問刷新15s
?
SESSION_COOKIE_NAME = "yuan" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑 SESSION_COOKIE_AGE = 15 # Session的cookie失效日期 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過期 SESSION_SAVE_EVERY_REQUEST = True # 是否每次請求都保存Session,默認(rèn)修改之后才保存?
?
8、session練習(xí)
1 登錄案例?
需要的頁面: #login.html:登錄頁面,提供登錄表單; #index1.html:主頁,顯示當(dāng)前用戶名稱,如果沒有登錄,顯示您還沒登錄; #index2.html:主頁,顯示當(dāng)前用戶名稱,如果沒有登錄,顯示您還沒登錄;思考,如果第二個人再次再同一個瀏覽器上登錄,django-session表會怎樣?
2 驗證碼案例
驗證碼可以去識別發(fā)出請求的是人還是程序!當(dāng)然,如果聰明的程序可以去分析驗證碼圖片!但分析圖片也不是一件容易的事,因為一般驗證碼圖片都會帶有干擾線,人都看不清,那么程序一定分析不出來。
PIL 模塊
?
9、cookie與 session總結(jié)
# cookie總結(jié) 1 response.set_cookie(key,value) 2 request.COOKIE.get(key)?
?
?
# sessiono總結(jié) 3 request.session[key] = value # 寫session 注意django對應(yīng)操作'''if request.COOKIE.get("session_id") wspn39juwcrrqxs091更新在django-session表中創(chuàng)建一條記錄:session-key session-datawspn39juwcrrqxs0916ftmlcvyl7c1gg 更新數(shù)據(jù)else:1.生成隨機字符串 q4r5q4rfar325432.response.set_cookie("session_id",q4r5q4rfar32543)3.在django-session表創(chuàng)建一條記錄:session-key session-dataq4r5q4rfar32543 {"is_login":True, "username":"alex"'''4 request.session[key] # 讀session'''1 request.COOKIE.get("session") # wspn39juwcrrqxs0916ftmlcvyl7c1gg2 django-session表中過濾記錄:在django-session表中創(chuàng)建一條記錄:session-key session-datawspn39juwcrrqxs0916ftmlcvyl7c1gg {"is_login":True, "username":"alex"obj = django-session.object.filter(session-key=wspn39juwcrrqxs0916ftmlcvyl73 obj.session-data.get("is_login")'''5. request.session.flush() # 刪除session"""1 random_str = request.COOKIE.get("sessionid")2 django-session.objects.filter(session-key=random_str).delete()3 response.delete_cookie("sessionid", random_str)"""?
轉(zhuǎn)載于:https://www.cnblogs.com/venicid/p/9314852.html
總結(jié)
以上是生活随笔為你收集整理的05-session-会话跟踪技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读spring源码(一)-ClassPa
- 下一篇: Java基础(五)继承和多态