Django 實戰(zhàn)2:利用 Session 實現(xiàn)自動登錄

題圖:by thefolkpr0ject from Instagram

上篇文章中講到 Django 如何啟動以及配置 sessions 功能。sessions 功能用是跟蹤用戶的狀態(tài)奉件,經(jīng)常結合 Cookie 功能實現(xiàn)自動登錄功能浑此。 所謂的“自動登錄”指的是:我們登錄一些網(wǎng)站,在不關閉瀏覽器以及距離上次登錄時間不是很長的情況下简僧。無論我們在新的標簽頁打開網(wǎng)站坛增,還是關閉頁面重新打開網(wǎng)站获雕,登錄狀態(tài)一直保持著。本文內(nèi)容有兩個:一是利用 Django 實現(xiàn)自動登錄功能收捣,二是揭開“自動登錄”的神秘面紗届案。

1 新建項目

我為了將本系列所有文章的示例代碼保持集中狀態(tài),所以直接在 Django_demo 項目中創(chuàng)建應用罢艾。如果第一次看這文章萝玷,需要先創(chuàng)建項目(project),再創(chuàng)建應用(app)昆婿。我新建的應用是 demo_session球碉。

點擊查看大圖

然后在 setting.py 中啟動請用,并檢查 sessions 組件是否啟動仓蛆。


點擊查看大圖

因為需要 Cookie 功能睁冬,所以同樣需要在 settings.py 增加一些配置。

SESSION_COOKIE_NAME = "sessionid"       # Session的cookie保存在瀏覽器上時的key
SESSION_COOKIE_PATH = "/"               # Session的cookie保存的路徑(默認)
SESSION_COOKIE_DOMAIN = None            # Session的cookie保存的域名(默認)
SESSION_COOKIE_SECURE = False           # 是否Https傳輸cookie
SESSION_COOKIE_HTTPONLY = True          # 是否Session的cookie只支持http傳輸(默認)
SESSION_COOKIE_AGE = 1209600            # Session的cookie失效日期(2周)(默認)
SESSION_SAVE_EVERY_REQUEST = False      # 是否設置關閉瀏覽器使得Session過期
SESSION_COOKIE_AT_BROWSER_CLOSE = False  # 是否每次請求都保存Session,默認修改之后才能保存

如果你將 SESSION_SAVE_EVERY_REQUEST 設置為 True豆拨, 那么關閉瀏覽器之后直奋,需要重新登錄。

2 流程

應用中會涉及到 3 個頁面施禾,所以我繪制流程圖幫助理解脚线。


點擊查看大圖

3 實現(xiàn)

3.1 新建 model

服務器接收到瀏覽器傳送過來登錄信息,需要驗證賬號和密碼等信息弥搞。所以需要新建 model 保存信息邮绿,以便后續(xù)跟數(shù)據(jù)庫做校驗。這里我只是簡單保存信息攀例,登錄驗證后續(xù)講解船逮。

class User(models.Model):
    username = models.CharField(max_length=20)  # 賬號
    password = models.CharField(max_length=20)  # 密碼
    nickname = models.CharField(max_length=20)  # 昵稱

3.2 新建 form

用戶將登錄信息發(fā)送給服務器是用到 POST 請求,所以需要創(chuàng)建表單粤铭。在應用目錄下新建名為 forms 目錄挖胃,然后創(chuàng)建 forms.py 文件。

from django.forms import ModelForm, TextInput, PasswordInput
from demo_session.models import User

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = ['username', 'password', ]  # 只顯示 model 中指定的字段
        # 指定呈現(xiàn)樣式字段梆惯、指定 CSS 樣式
        widgets = {
            'username': TextInput(attrs={'class': 'text',
                                         'value': 'monkey'}),
            'password': PasswordInput(attrs={'value': '13245678', })
        }

3.3 新建視圖

頁面一共有三個酱鸭,分別是登錄、首頁垛吗、登出凹髓。具體實現(xiàn)如下:

# view.py
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
from demo_session.form.forms import UserForm

# 用戶登錄
def login_view(request):
    # 過濾 POST 方法的請求
    if request.method == 'POST':
        userfrom = UserForm(request.POST)
        # 驗證表單
        if userfrom.is_valid():
            username = userfrom.cleaned_data['username']
            password = userfrom.cleaned_data['password']
            # ... 執(zhí)行驗證登錄信息操作

            # 將等你信息傳遞給 Session 對象, 實際應用中不建議這么操作
            request.session['username'] = username
            # 跳轉到頁面
            return HttpResponseRedirect('/index/')
    else:
        # 不是 GET 請求則顯示表單
        userfrom = UserForm()
    template_view = 'login.html'
    return render(request, template_view, {'userfrom': userfrom})

# 成功登錄之后, 跳轉首頁
def index_view(request):
    username = request.session.get('username', '')
    # print(username)
    template_view = 'index.html'
    return render(request, template_view, {'username': username})

# 登出操作
def logout_view(request):
    # 刪除 session
    del request.session['username']
    return HttpResponse('登出成功')

3.4 對應模板

視圖 login_view, index_view 對應的模板是 login.html, index.html。
其中 login.html 的實現(xiàn)如下:

{% load staticfiles %}
<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE|default:"en-us" }}">
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
    <link href="{% static 'css/style.css' %}" rel="stylesheet" type='text/css' >
    <!--webfonts-->
    <link href="{% static 'css/font.css' %}" rel='stylesheet' type='text/css'>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script type="application/x-javascript">
            addEventListener("load", function() { setTimeout(hideURLbar, 0); }, false);
            function hideURLbar(){ window.scrollTo(0,1); }</script>
</head>
<body>
    <div class="main">
        <div class="login-form">
        <h1>Member Login</h1>
            <div class="head">
                <img src="{% static 'images/user.png' %}" alt=""/>
            </div>
            <form action="" method="POST">
                {% csrf_token %}
                {{ userfrom.username }}
                {{ userfrom.password }}
                <div class="submit"><input type="submit" value="login" ></div>
                <p><a href="#">Forgot Password ?</a></p>
            </form>
        </div>
    </div>
</body>
</html>

index.html 的實現(xiàn)如下:

<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE|default:"en-us" }}">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
    <div >
        <h3>歡迎 {{username}} 到來~</h3>
        <div class="submit"><a href="/logout"><input type="submit" value="退出登錄" ></a></div>
    </div>
</body>
</html>

3.5 配置路由

最后一步职烧,在 urls.py 中配置訪問路徑:

from demo_session.views import login_view, index_view, logout_view

urlpatterns = [
    # demo_session
    path('login/', login_view, name='login'),
    path('index/', index_view, name='index'),
    path('logout/', logout_view, name='index'),
]

4 實現(xiàn)效果

用戶訪問 http://127.0.0.1/login 進行登錄操作扁誓。

點擊查看大圖

當點擊 login 成功之后,會跳轉到首頁蚀之,首頁會顯示用戶名蝗敢。同時,Cookie 中多了一個 sessionid 的字段足删。這字段名就是我們在 setttings.py 定義的寿谴。

點擊查看大圖

查詢數(shù)據(jù)庫 django_session 表的內(nèi)容,會多出一條數(shù)據(jù)失受。


點擊查看大圖

表中的字段含義如下:

  • session_key: 就是服務器給用戶返回的id讶泰。在瀏覽器當中,這個值是保存為sessionid
  • session_data: 這是一個加密后的信息拂到,用來保存用戶名和密碼等信息
  • expire_data: 過期時間痪署,Django可以設置過期時間

在新的標簽頁中打開首頁,依然能看到 username 信息兄旬。這證明能自動登錄狼犯。


點擊查看大圖

如果用戶退出登錄,再訪問首頁。這時會發(fā)現(xiàn)看不到了 username 信息了悯森。


點擊查看大圖

5 小結

實現(xiàn)自動登錄功能其實不難宋舷,只需要在 Django 的 Sessions 組件。然后根據(jù)場景需要瓢姻,在 settings.py 配置 session 以及 cookie 等信息祝蝠。


往前 Django 學習筆記文章
Django 學習筆記之環(huán)境搭建
Django 學習筆記之初始
Django 學習筆記之視圖與URL配置
Django 學習筆記之模板
Django 學習筆記之模型(上)
Django 學習筆記之模型(下)
Django 學習筆記之后臺管理
Django 學習筆記之模型表單
Django 學習筆記之使用舊數(shù)據(jù)庫
Django 實戰(zhàn)1:搭建屬于自己社工查詢系統(tǒng)(上)
Django 實戰(zhàn)1:搭建屬于自己社工查詢系統(tǒng)(下)
Django 學習筆記之模型高級用法(上)
Django 學習筆記之模型高級用法(下)
Django 實現(xiàn)分頁功能
Django 使用會話( sessions )功能


本文原創(chuàng)發(fā)布于微信公眾號「極客猴」,歡迎關注第一時間獲取更多原創(chuàng)分享

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幻碱,一起剝皮案震驚了整個濱河市绎狭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌收班,老刑警劉巖坟岔,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谒兄,死亡現(xiàn)場離奇詭異摔桦,居然都是意外死亡,警方通過查閱死者的電腦和手機承疲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門邻耕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人燕鸽,你說我怎么就攤上這事兄世。” “怎么了啊研?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵御滩,是天一觀的道長。 經(jīng)常有香客問我党远,道長削解,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任沟娱,我火速辦了婚禮氛驮,結果婚禮上,老公的妹妹穿的比我還像新娘济似。我一直安慰自己矫废,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布砰蠢。 她就那樣靜靜地躺著蓖扑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪台舱。 梳的紋絲不亂的頭發(fā)上律杠,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音,去河邊找鬼俩功。 笑死幻枉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的诡蜓。 我是一名探鬼主播熬甫,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔓罚!你這毒婦竟也來了椿肩?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤豺谈,失蹤者是張志新(化名)和其女友劉穎郑象,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茬末,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡厂榛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丽惭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片击奶。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖责掏,靈堂內(nèi)的尸體忽然破棺而出柜砾,到底是詐尸還是另有隱情,我是刑警寧澤换衬,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布痰驱,位于F島的核電站,受9級特大地震影響瞳浦,放射性物質發(fā)生泄漏担映。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一术幔、第九天 我趴在偏房一處隱蔽的房頂上張望另萤。 院中可真熱鬧,春花似錦诅挑、人聲如沸四敞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忿危。三九已至,卻和暖如春没龙,著一層夾襖步出監(jiān)牢的瞬間铺厨,已是汗流浹背缎玫。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留解滓,地道東北人赃磨。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像洼裤,于是被迫代替她去往敵國和親邻辉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 點我查看本文集的說明及目錄腮鞍。 本項目相關內(nèi)容包括: 實現(xiàn)過程: CH7 創(chuàng)建在線商店 CH8 管理支付和訂單 CH...
    學以致用123閱讀 4,878評論 8 9
  • 此段內(nèi)容簡要來自自強學堂的教程詳情請查詢自強學堂 一值骇、 后臺的運作流程 接收request請求 處理數(shù)據(jù) 獲取請求...
    coder_ben閱讀 5,246評論 6 56
  • 22年12月更新:個人網(wǎng)站關停,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,188評論 22 257
  • 最近,在看一部日劇迹缀,叫做《四重奏》使碾,用我的感受來說,這是一部用音樂的外表穿插著愛情去講述的懸疑故事裹芝。 四個年輕的音...
    CBobZ閱讀 1,560評論 3 10
  • 有一種愛叫他給了她一切他能給她的... 有一種拋棄叫她知道他給她的只能如此部逮,還不滿足娜汁,所以就拋棄他...
    Gakki喲閱讀 74評論 0 0