Django - Cookie&Session

圖片.png

獲取cookie:

圖片.png

設(shè)置cookie:

這中設(shè)置cookie,關(guān)閉瀏覽器就失效了。

圖片.png

實(shí)例:

res = redirect('/index/')
res.set_cookie('username', 'liao', max_age=10)  # 10秒之后失效
return res

或者:

import datetime
current_date = datetime.datetime.utcnow()
expires_date = current_date + datetime.timedelta(seconds=10)  # 10秒之后過期
res.set_cookie('username', 'liao', expires=expires_date)

session:

圖片.png

Session依賴于Cookie,
服務(wù)端session:

request.session.get()
request.session[x] = x
request.session.clear()

配置文件中設(shè)置默認(rèn)操作:

SESSION_COOKIE_NAME = "seesionid"
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_AGE = 1209600  # session的cookie失效日期
SESSION_COOKIE_AT_BROWSER_CLOSE = False  # 是否關(guān)閉瀏覽器使得session失效。

======


一、Cookie

如果禁用cookie,那么在所有的需要登錄網(wǎng)站,都不能使用了。
實(shí)質(zhì)是:客戶端瀏覽器上的一個(gè)文件。
類似于鍵值對的形式存在,像字典。

比如liao用戶登錄了服務(wù)器,服務(wù)器返回了一個(gè)鍵值對:

{ "is_login": "etrashdkjndas6ioiwdgvqjbwhkje"}

如果liao用戶保留了這個(gè)字符串,存在于本地。

cookie的保存與瀏覽器的特點(diǎn),我們可以使用這個(gè)特征來實(shí)現(xiàn)用戶登錄的功能。

示例:

設(shè)置cookie:

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':

        u = request.POST.get('username')
        p = request.POST.get('pwd')

        dic = user_info.get(u)
        if not dic:
            return render(request, 'login.html')
        if dic['pwd'] == p:

            res = redirect('/index/')
            res.set_cookie('username', u)

            return res
        else:
            return render(request, 'login.html')

注意我們的res.set_cookie(),就給瀏覽器設(shè)置了cookie。return之后就設(shè)置了。

示例:

取的cookie:

def index(request):
    # 獲取當(dāng)前已經(jīng)登錄的用戶名

    v = request.COOKIES.get('username')

    print v

    if not v:
        return redirect('/cookie/login/')

    return render(request, 'cookie/index.html', {'current_user':v})

上面兩個(gè)例子,實(shí)現(xiàn)了用戶驗(yàn)證。
登錄成功,set cookie,然后再判斷cookie是否存在。

1)獲取cookie:

request.COOKIES.get('username')
request.COOKIES['username']

2)設(shè)置cookie的時(shí)候需要注意:
返回的時(shí)候,需要設(shè)置cookie:

    response = request.POST.get('username')
    response.set_cookie('key', 'value')
    return response

注意,這里是服務(wù)端的寫入。

3)注銷的時(shí)候,清除掉cookie:
我們設(shè)置過期時(shí)間為當(dāng)前時(shí)間,就清除了。

res.set_cookie('key', 'value', max_age=0)

如果按照上面的方式,關(guān)閉瀏覽器,再開啟瀏覽器cookie就會(huì)失效。

Cookie實(shí)現(xiàn)用戶登錄

cookie的用法:

1)設(shè)置cookie過期時(shí)間
方式一:

response = reidrect('/cookie/index/')
response.set_cookie('key', 'value', max_age=10)  # 過期時(shí)間為10秒
return response

方式二:

import datetime
            current_date = datetime.datetime.utcnow()

            #res.set_cookie('username', u, max_age=4)
            res.set_cookie('username', u, expires=current_date + datetime.timedelta(seconds=10)) # 10秒之后過期

            return res

2)設(shè)置生效的路徑:path

比如分頁的時(shí)候,分頁的cookie生效路徑只能是那里。

3)設(shè)置生效的域名:domain

4)設(shè)置只能是httponly的情況:

稍微安全一點(diǎn)點(diǎn)。

res.set_cookie('user_type', 'asdqwe', httponly=True)
圖片.png

5)在客戶端讀寫cookie。
對比上面的服務(wù)端的讀寫cookie。

實(shí)例,通過js實(shí)現(xiàn)寫cookie。
jquery的插件jquery.cookie.js.

6)js中設(shè)置cookie的path。
那么此cookie只能在這個(gè)path中使用。

   function change_page_size(ths){
        var v = $(ths).val();   // 這個(gè)$(this)是擁有此方法的html元素
        $.cookie('per_page_size', v, {'path':'/cookie/user_list/'});  // 設(shè)置cookie

        location.reload();  // 重新刷新頁面
    }

7)設(shè)置帶簽名的cookie

服務(wù)端設(shè)置帶簽名的cookie,加鹽。

res = HttpResponse('xxx')
res.set_signed_cookie('username', 'liao' , salt=‘a(chǎn)sdasa’)

# 取出加鹽后的cookie
request.get_signed_cookie('username', salt='asdasa')

Session

引子:基于Cookie做用戶驗(yàn)證的時(shí)候,敏感信息最好不要放在Cookie中。

Session原理:是保存在服務(wù)器端的鍵值對。

圖片.png

注意:要使用session,必須先做以下的步驟創(chuàng)建django_sesseion表:

python manage.py makemigrations 
python manage.py migrate

示例:

# 服務(wù)端設(shè)置session

def login1(request):
    if request.method == 'GET':
        return render(request, 'cookie/login1.html')
    elif request.method == 'POST':

        username = request.POST.get('username')
        pwd = request.POST.get('pwd')

        print ('username:'+username, 'pwd:'+pwd)

        if username == 'root' and pwd == '123':

            # 生成隨機(jī)字符串
            # 攜帶到用戶瀏覽器cookie
            # 保存到session中
            # 在隨機(jī)字符串的字典中設(shè)置相關(guān)內(nèi)容

            request.session['username'] = username # 上面的四件事情,這一句就做了
            request.session['is_login'] = True

            return redirect('/cookie/index1/')
        else:
            return render(request, 'cookie/login1.html')


# 服務(wù)端取得session

def index1(request):

    if request.session.get('is_login', None) == True:
        return HttpResponse('index1')
    else:
        return HttpResponse('you did not login')

我們可以看到Cookie中有一個(gè)sessionid,說明session依賴于cookie:

圖片.png

操作session比操作cookie簡單多了,因?yàn)閐jango已經(jīng)幫我們做了很多事情。

session的操作:

request.session['key'] = value  # 設(shè)置
request.session.get('key', None)  # 取得session
request.session.setdefault('k1', 123)  # 存在則不設(shè)置
del request.session['key']  # 刪除session

# 所有的鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()  # 鍵值對
request.session.iterkeys()

# 用戶session的隨機(jī)字符串
reques.session.session_key  

# 將所有session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除
request.session.clear_expired()  

# 檢查 用戶session的隨機(jī)字符串 在數(shù)據(jù)庫中是否存在
request.session.exists("session_key")

# 刪除session
1. request.session.delete("session_key")  # 刪除此用戶所有session
2.del request.session['k1']  # 刪除session中的k1對應(yīng)的item
3.request.session.clear()  # 效果和1相同,不過更加簡單。在注銷的時(shí)候使用。

# 設(shè)置失效時(shí)間
request.session.set_expiry(value)
如果value是個(gè)證書,session會(huì)在這些秒數(shù)之后失效。
如果value是個(gè)datatime或者timedelta,session就會(huì)在這個(gè)時(shí)間后失效
如果value是0,那么用戶關(guān)閉瀏覽器session就會(huì)失效
如果value是None,session會(huì)依賴全局session失效策略

eg: 
request.session.set_expiry(60*60)  # 設(shè)置保存一個(gè)小時(shí)


模板中使用session:
可以有2種方式,第一是views.py傳遞過來,第二是從request.session中取出

<body>

welcome {{ username }}! <br>

{{ request.session.username }}

</body>

session與cookie

settings.py中的配置:

圖片.png

這些是默認(rèn)值,配置文件中沒有寫的話,就默認(rèn)是這些。
但是注意,一般會(huì)將:

SESSION_SAVE_EVERY_REQUEST = True

每次請求,都會(huì)向后推遲過期時(shí)間。

SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 這個(gè)是默認(rèn)的配置,說明將session存于數(shù)據(jù)庫

如果你想要將session放到緩存中,只需要改為:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'  # 使用的緩存別名,也可以是memcache

有三種緩存的方式:
1)數(shù)據(jù)庫db
2)緩存 memcache
3)文件級別 file

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = os.path.join(BASE_DIR, 'cache') # 在根目錄新建一個(gè)cache目錄

4)緩存+數(shù)據(jù)庫Session

django內(nèi)部不支持redis,只支持MemcachedCache.


經(jīng)驗(yàn)

1.注意:
session存在于服務(wù)器里面,前端是獲取不到的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容