nvm管理Node.js版本
cookie簡介
大家都知道HTTP協議是無狀態的。
無狀態的意思是每次請求都是獨立的,它的執行情況和結果與前面的請求和之後的請求都無直接關係,它不會受前面的請求響應情況直接影響,也不會直接影響後面的請求響應情況。
一句有意思的話來描述就是人生只如初見,對伺服器來說,每次的請求都是全新的。
狀態可以理解為客戶端和伺服器在某次會話中產生的資料,那無狀態的就以為這些資料不會被保留。會話中產生的資料又是我們需要儲存的,也就是說要“保持狀態”。因此Cookie就是在這樣一個場景下誕生。
Cookie具體指的是一段小資訊,它是伺服器傳送出來儲存在瀏覽器上的一組組鍵值對,下次訪問伺服器時瀏覽器會自動攜帶這些鍵值對,以便伺服器提取有用資訊。
cookie操作
# 雖然cookie是服務端告訴客戶端瀏覽器需要儲存內容 # 但是客戶端瀏覽器可以選擇拒絕儲存 如果禁止了 那麼 只要是需要記錄使用者狀態的網站登陸功能都無法使用了 # 檢視函式的返回值 return HttpResponse() return render() return redirect() obj1 = HttpResponse() # 操作cookie return obj1 obj2 = render() # 操作cookie return obj2 obj3 = redirect() # 操作cookie return obj3 # 如果你想要操作cookie,你就不得不利用obj物件""" 設定cookie obj.set_cookie(key,value) 獲取cookie request.COOKIES.get(key) 在設定cookie的時候可以新增一個超時時間 obj.set_cookie('username', 'jack',max_age=3,expires=3) max_age expires 兩者都是設定超時時間的 並且都是以秒為單位 需要注意的是 針對IE瀏覽器需要使用expires 主動刪除cookie(登出功能) obj.delete_cookie('key')
使用cookie實現簡易的登入功能
# 裝飾器 def log_auth(func): def inner(request, *args, **kwargs): if request.COOKIES.get('username') == '123567': res = func(request, *args, **kwargs) return res else: last_addr = request.get_full_path() return redirect('/login/?last=%s' % last_addr) return inner # 登入功能 def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'xk' and password == '123': last_addr = request.GET.get('last') if last_addr: obj = redirect(last_addr) else: obj = redirect('/home/') obj.set_cookie('username', '123567') return obj return render(request, 'login.html') # 首頁 @log_auth def home(request): return HttpResponse('Home') # 登出 @log_auth def logout(request): obj = redirect('/login/') obj.delete_cookie('username') return obj # 其他功能 @log_auth def index(request): return HttpResponse('index')View Code
session簡介
Session:在計算機中,尤其是在網路應用中,稱為“會話控制”。Session物件儲存特定使用者會話所需的屬性及配置資訊。這樣,當用戶在應用程式的Web頁之間跳轉時,儲存在Session物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當用戶請求來自應用程式的 Web頁時,如果該使用者還沒有會話,則Web伺服器將自動建立一個 Session物件。當會話過期或被放棄後,伺服器將終止該會話。Session 物件最常見的一個用法就是儲存使用者的首選項。例如,如果使用者指明不喜歡檢視圖形,就可以將該資訊儲存在Session物件中。有關使用Session 物件的詳細資訊,請參閱“ASP應用程式”部分的“管理會話”。注意會話狀態僅在支援cookie的瀏覽器中保留
session操作
# session資料是儲存在服務端的,給客戶端返回的是一個隨機字串
設定session request.session['key'] = value 獲取session request.session.get('key') 設定過期時間
django預設session的過期時間是14天
但是你也可以人為的修改它
request.session.set_expiry() 括號內可以放四種類型的引數 1.整數 多少秒 2.日期物件 到指定日期就失效 3.0 一旦當前瀏覽器視窗關閉立刻失效 4.不寫 失效時間就取決於django內部全域性se ssion預設的失效時間 清除session request.session.delete() # 只刪服務端的 客戶端的不刪 request.session.flush() # 瀏覽器和服務端都清空(推薦使用) session是儲存在服務端的 但是session的儲存位置可以有多種選擇 1.MySQL 2.檔案 3.redis 4.memcache ...
django_session表中的資料條數是取決於瀏覽器的
同一個計算機上(IP地址)同一個瀏覽器只會有一條資料生效
(當session過期的時候可能會出現多條資料對應一個瀏覽器,但是該現象不會持續很久,內部會自動識別過期的資料清除 你也可以通過程式碼清除)
主要是為了節省服務端資料庫資源
session設定與取值內部詳解
request.session['hobby'] = 'girl' """ 內部發送了那些事 1.django內部會自動幫你生成一個隨機字串 2.django內部自動將隨機字串和對應的資料儲存到django_session表中 2.1先在記憶體中產生操作資料的快取 2.2在響應結果django中介軟體的時候才真正的操作資料庫 3.將產生的隨機字串返回給客戶端瀏覽器儲存 """ request.session.get('hobby') """ 內部發送了那些事 1.自動從瀏覽器請求中獲取sessionid對應的隨機字串 2.拿著該隨機字串去django_session表中查詢對應的資料 3. 如果比對上了 則將對應的資料取出並以字典的形式封裝到request.session中 如果比對不上 則request.session.get()返回的是None """
使用session完成一個簡易的登入
def auth_log(func): def inner(request, *args, **kwargs): last_addr = request.get_full_path() if request.session.get('user'): res = func(request, *args, **kwargs) return res else: return redirect('/s_login/?last=%s' % last_addr) return inner def s_login(request): if request.method == 'POST': user = request.POST.get('username') pwd = request.POST.get('password') if user == 'xk' and pwd == '123': request.session['user'] = user if request.GET.get('last'): return redirect(request.GET.get('last')) else: return redirect('/s_home/') return render(request, 's_login.html') @auth_log def s_home(request): return HttpResponse('首頁頁面,登入才能檢視') @auth_log def index(request): current_user = request.session.get('user', None) return render(request, 'index.html', locals()) @auth_log def del_log(request): request.session.flush() return redirect('/s_login/')View Code
CBV如何新增裝飾器
from django.views import View from django.utils.decorators import method_decorator """ CBV中django不建議你直接給類的方法加裝飾器 無論該裝飾器能都正常給你 都不建議直接加 """ # @method_decorator(login_auth,name='get') # 方式2(可以新增多個針對不同的方法加不同的裝飾器) # @method_decorator(login_auth,name='post') class MyLogin(View): @method_decorator(login_auth) # 方式3:它會直接作用於當前類裡面的所有的方法 def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs) # @method_decorator(login_auth) # 方式1:指名道姓 def get(self,request): return HttpResponse("get請求") def post(self,request): return HttpResponse('post請求')