1. 程式人生 > 其它 >nvm管理Node.js版本

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請求')