日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Django-Cookies && Session

作者:lonely-hermit 更新時間: 2022-05-13 編程語言

HTTP被設(shè)計為”?態(tài)”,也就是俗稱“臉盲”。 這?次請求和下?次請求 之間沒有任何狀態(tài)保持,我們?法根據(jù)請求的任何??(IP地址,?戶代理等)來識別來?同??的連續(xù)請求。實現(xiàn)狀態(tài)保持的?式:在客戶端或服務(wù)器端存儲與會話有關(guān)的數(shù)據(jù)(客戶端與服務(wù)器端的?次通信,就是?次會話)

一、Cookies

cookies 是瀏覽器為 Web 服務(wù)器存的??信息。 每次瀏覽器從某個服務(wù)器請求頁面時,都會?動帶上以前收到的cookie。cookie保存在客戶端,安全性較差,注意不要保存敏感信息

1.1、設(shè)置Cookies

HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
# 同上,不同點(diǎn)在于設(shè)置salt,即加鹽
HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
key:cookie的名稱(*)

value:cookie的值,默認(rèn)是空字符

max_age:cookies的持續(xù)有效時間(以秒計),如果設(shè)置為None,cookies在瀏覽器關(guān)閉的時候就失效了。

expires:cookies的過期時間,格式:"Wdy,DD-Mth-YYHH:MM:SSGMT"如果設(shè)置這個參數(shù),它將覆蓋max_age。

path:cookie?效的路徑前綴,瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣你可以避免將cookie傳給站點(diǎn)中的其他的應(yīng)?。/表示根路徑,根路徑的cookie可以被任何url的??訪問

domain:cookie?效的站點(diǎn)。你可?這個參數(shù)來構(gòu)造?個跨站cookie。如,domain=".example.com"所構(gòu)造的cookie對下?這些站點(diǎn)都是可讀的:www.example.com、www2.example.com。如果該參數(shù)設(shè)置為None,cookie只能由設(shè)置它的站點(diǎn)讀取。

secure:如果設(shè)置為True,瀏覽器將通過HTTPS來回傳cookie。

httponly:僅http傳輸不能使?js獲取cookie

1.2、獲取Cookies

# 獲取cookie
HttpRequest.COOKIES.get(key)
# 獲取加“鹽”的cookie
HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='',max_age=None)

1.3、刪除Cookies

# 刪除cookie
HttpResponse.delete_cookie(key, path='/', domain=None)

1.4、Cookies路由保護(hù)實例

app/views.py

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect
from django.urls import reverse


def check_login(func):
    def inner(request, *args, **kwargs):
        if request.COOKIES.get('username'):
            return func(request, *args, **kwargs)
        else:
            return redirect(reverse('app:login'))

    return inner


@check_login
def index(request):
    return HttpResponse(request.COOKIES.get('username') + ' is login')


def login(request):
    if request.method == 'POST':
        postData = request.POST.dict()
        postData.pop('csrfmiddlewaretoken')
        # 這里我們?yōu)榱朔奖悴辉谶M(jìn)行數(shù)據(jù)庫查詢,直接設(shè)置username和password
        if postData.get('username') == '123' and postData.get('password') == '123':
            res = redirect(reverse('app:index'))
            # 設(shè)置10s后過期
            res.set_cookie(key='username', value=postData.get('username'), max_age=10)
            return res
    return render(request, 'app/login.html')

app/urls.py

from django.urls import path, include
from app import views

app_name = 'app'

urlpatterns = [
    path('index/', views.index, name='index'),
    path('login/', views.login, name='login'),
]

template/app/login.html

doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Documenttitle>
head>
<body>
    <form action="http://127.0.0.1:8000/app/login/" method="post">
        {% csrf_token %}
        username:<input type="text" name="username">
        password:<input type="text" name="password">
        <input type="submit">
    form>
body>
html>

我們運(yùn)行項目可以發(fā)現(xiàn),登陸以后我們可以到主界面,但是十秒鐘以后刷新時就需要重新登陸了。

二、Session

cookie看似解決了HTTP(短連接、?狀態(tài))的會話保持問題,但把全部?戶數(shù)據(jù)保存在客戶端,存在安全隱患,于是session出現(xiàn)了。我們可以把關(guān)于?戶的數(shù)據(jù)保存在服務(wù)端,在客戶端cookie?加?個sessionID(隨機(jī)字符串)。其?作流程:
(1)、當(dāng)?戶來訪問服務(wù)端時,服務(wù)端會?成?個隨機(jī)字符串;
(2)、當(dāng)?戶登錄成功后把{sessionID:隨機(jī)字符串}組織成鍵值對加到cookie?發(fā)送給?戶;
(3)、服務(wù)器以發(fā)送給客戶端cookie中的隨機(jī)字符串做鍵,?戶信息做值,保存?戶信息;
(4)、再訪問服務(wù)時客戶端會帶上sessionid,服務(wù)器根據(jù)sessionid來確認(rèn)?戶是否訪問過?站

2.1、區(qū)別與聯(lián)系

這樣我們的信息就保存在了服務(wù)器中,客戶端只保存了SessionID,這樣很安全,但是加重了服務(wù)器的負(fù)擔(dān),每次都需要查詢服務(wù)器,而且分布式中這樣的方式再不同的服務(wù)器上還需要重新登錄。cookie在客戶端存儲值有??的限制,?約?kb,session信息存儲在服務(wù)器則沒有限制

Session基于Cookies實現(xiàn)

2.2、Session的配置

# 這個app默認(rèn)是有的
INSTALLED_APPS = [
    'django.contrib.sessions',
]
# 這個中間件默認(rèn)也是有的
MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
]

要使用Session必須先進(jìn)行數(shù)據(jù)庫的遷移

2.3、Session的設(shè)置

我們還用上一個例子來講解Session的設(shè)置

只需要修改 views.py

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect
from django.urls import reverse


def check_login(func):
    def inner(request, *args, **kwargs):
        if request.session.get('username'):
            return func(request, *args, **kwargs)
        else:
            return redirect(reverse('app:login'))

    return inner


@check_login
def index(request):
    return HttpResponse(request.session.get('username') + ' is login')


def login(request):
    if request.method == 'POST':
        postData = request.POST.dict()
        postData.pop('csrfmiddlewaretoken')
        # 這里我們?yōu)榱朔奖悴辉谶M(jìn)行數(shù)據(jù)庫查詢,直接設(shè)置username和password
        if postData.get('username') == '123' and postData.get('password') == '123':
            res = redirect(reverse('app:index'))
            # 我們設(shè)置session,這里注意這個方法在request中
            request.session['username'] = postData.get('username')
            return res
    return render(request, 'app/login.html')

我們監(jiān)控我們提交表單的時候我們發(fā)送了什么,headers里面有Cookie

Cookie: csrftoken=SivHHihe4ppXF49toaZ0R2SxBisHyOpfwcU2cGi9K3B7JXdBIT71LAnMBHvinDFL; sessionid=epqs9x94bwy9pf8sf12d48bmg65f6s4l

我們發(fā)現(xiàn)我們發(fā)送了一個sessionID,至于我們保存的username已經(jīng)被保存在了數(shù)據(jù)庫中,這也是為什么要進(jìn)行數(shù)據(jù)遷移的原因。

2.4、Session的刪除

# clear 清空所有session,但不會把表中的數(shù)據(jù)刪除
# flush 清空所有并刪除表中數(shù)據(jù)
# logout 退出登錄,清除所有并刪除表中數(shù)據(jù)
# del req.session['key'] 刪除某一個session值
def logout(request):
	request.session.flush()
    return redirect(reverse("App:login"))

原文鏈接:https://blog.csdn.net/weixin_43903639/article/details/122886603

欄目分類
最近更新