十二、python cookie和session

COOKIE 與 SESSION
簡介
1、cookie不屬於http協議範圍,由於http協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個場景下誕生。
cookie的工作原理是:由服務器產生內容,瀏覽器收到請求後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能通過cookie的內容來判斷這個是“誰”了。
2、cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於cookie本身最大支持4096字節,以及cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節,並且他保存在服務器,有較高的安全性。這就是session。
問題來了,基於http協議的無狀態特徵,服務器根本就不知道訪問者是“誰”。那麼上述的cookie就起到橋接的作用。
我們可以給每個客戶端的cookie分配一個唯一的id,這樣用戶在訪問時,通過cookie,服務器就知道來的人是“誰”。然後我們再根據不同的cookie的id,在服務器上保存一段時間的私密資料,如“賬號密碼”等等。
3、總結而言:cookie彌補了http無狀態的不足,讓服務器知道來的人是“誰”;但是cookie以文本的形式保存在本地,自身安全性較差;所以我們就通過cookie識別不同的用戶,對應的在session裏保存私密的信息以及超過4096字節的文本。
4、另外,上述所說的cookie和session其實是共通性的東西,不限於語言和框架

此處,我們可以模擬用戶登錄,獲取到cookie和session

一、設置html頁面:

一個前臺登錄頁面login.html,一個後臺頁面,就是我們測試過的分頁,一個查看session的backend.html頁面。
login.html

{% extends "base.html" %}
{% block content %}
<div>
    <form method="post">
        <input type="text" name="username" placeholder="用戶名:">
        <input type="text" name="password" placeholder="密碼:">
        <input type="submit" value="提交">
    </form>
</div>
{% endblock %}

backend.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="container">
    <h4>cookie 內容是 {{ cookie_content }}</h4>
    <h4>session 內容是 {{ session_content }}</h4>
    <h4>登錄用戶名 :{{ username }}</h4>
    <a href="../logout">註銷</a>
</div>
</body>
</html>

2、配置後臺views.py邏輯代碼

def login(request):
    if request.method == 'GET':
        # 第一次登陸跳轉到登陸
        return render(request,'login.html')
    else:
        #當取不到值的時候返回false
        Username = request.POST.get('username',False)
        Password = request.POST.get('password',False)
        # print ('username:',username)
        # print ('password:',password)
        if not Password or not Username:
            return HttpResponse('用戶名密碼不能爲空')
        else:
            #去數據庫匹匹配賬戶密碼
            user_obj = models.Userinfo.objects.filter(username=Username,password=Password)
            if user_obj.first():
                #登錄成功
                #return HttpResponse("歡迎來到我的世界")
                #設置session內部的字典內容
                request.session['is_login'] = user_obj.first().name
                request.session['username'] = Username
                #登錄成功就跳轉到後臺頁面
                return redirect("/page")
                #return redirect('/session')
            else:
                return HttpResponse("賬號密碼錯誤")


def Session(request):
    '''
    這裏必須用讀取字典的get()方法把login的value缺省設置爲False,
    當用戶訪問backend這個url先嚐試獲取這個瀏覽器對應的session中的
    login的值。如果對方登錄成功的話,在login裏就已經把login
    的值修改爲了True,反之這個值就是False的
    '''
    get_session = request.session.get('is_login',False)
    #如果爲真,說明用戶正常登錄
    if get_session:
        cookie_content = request.COOKIES
        session_content = request.session
        username = request.session['username']
        return render(request, 'backend.html',{
                      'cookie_content':cookie_content,
                      'session_content':session_content,
                       'username':username
                            })
    else:
        '''
        如果訪問的時候沒有攜帶正確的session,
        就直接被重定向url回login頁面  
        '''
        return redirect('/login/')
#清除session
def del_session(request):
    request.session.clear()
    get_session = request.session.get('is_login','退出登錄')
    return HttpResponse(json.dumps(get_session))

3、在url.py中配置入口路由

url(r'^login/$', views.login),
url(r'^logout/', views.del_session),
url(r'^session/', views.Session),

4、取消安全訪問機制csrf

注意:csrf生產環境不能去掉,
在setting中註釋下面帶csrf的代碼
在這裏插入圖片描述

5、測試訪問

1、登錄,

當輸入正確的賬戶密碼時,會跳轉到分頁的頁面

在這裏插入圖片描述
在這裏插入圖片描述

2、查看session

此時我們能查看session頁面查看獲取到的session值了
在這裏插入圖片描述

3、清除session

此時,我們清除session以後,http://127.0.0.1:8080/session/這個頁面就不能訪問了,直接跳轉到了Login頁面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章