iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 8
0
Modern Web

來個Django Web介面測試吧系列 第 8

來個Django Web介面測試吧:Day08-Django 視圖(view)之4

cookie & session

  • 使用存摺和銀行卡比喻cookie & session 的話,如下:
    • cookie:存摺 存款紀錄在瀏覽器中,可能會有安全疑慮,被看光光。
    • session:銀行卡號 存款紀錄在銀行(django伺服器中),透過一組號碼對銀行存取,資料相對安全。

    這邊用到了相對安全,沒有絕對安全,只有相對安全


實作cookie

  • 實作最終的結果如下:
    https://ithelp.ithome.com.tw/upload/images/20190909/20102269Hptrlkcozj.jpg

    • 透過chrome(F12 or Ctrl + shift + I),呼叫開發人員工具查看cookie,可發現user:admin
  • sign\views.py路徑新增如下圖程式碼:
    https://ithelp.ithome.com.tw/upload/images/20190909/20102269R8AQCK3nZG.jpg
    - response.set_cookie('user',id,3600):
    - 'user':對應輸入的資料name(如開發人員工具中的圖片所示)。
    - id:對應value,抓取使用者輸入的值為admin。
    - 3600:為儲存在瀏覽器中的秒數,秒為單位。

    • sign\templates\login_ok.html修改下圖程式碼:
      https://ithelp.ithome.com.tw/upload/images/20190909/201022698tLhl8TxgI.jpg

實作session

  • 實作最終的結果如下:
    https://ithelp.ithome.com.tw/upload/images/20190909/20102269IWBWDljpVi.jpg

    • sessionid:為前面所說的銀行卡號。
  • sign\views.py路徑修改新增如下圖程式碼:
    https://ithelp.ithome.com.tw/upload/images/20190909/20102269FPSR6yeMLG.jpg

    • 重新登錄畫面,會不成功,出現如下圖,沒有session tab
      https://ithelp.ithome.com.tw/upload/images/20190909/20102269GrdLmSDQrH.jpg
    • 此時需要建立django_session tab
      • 輸入指令python manage.py migrate
        https://ithelp.ithome.com.tw/upload/images/20190909/20102269pqRjnioJ9y.jpg
    • 透過migrate移轉資料,便生成資料庫tab了,django內建SQLite3資料庫,如下圖:
      https://ithelp.ithome.com.tw/upload/images/20190909/20102269tJDDQlU5zC.jpg

好了,以上都僅是實驗,不是好的登錄設計機制

程式碼中使用單純的if...else驗證使用者輸入帳號/密碼,不是一個好機制,下列透過django的認證系統實作真正的使用者資訊驗證方法。

這邊使用預設的資料庫SQLite3,若需要使用其他資料庫請參考官方文件

  • 建立後台管理員帳號密碼,使用指令python manage.py createsuperuser
    https://ithelp.ithome.com.tw/upload/images/20190909/20102269XIOCMMdB0X.jpg

    • 帳號設立:amdin
    • 密碼設立:amdin123456
  • http://127.0.0.1:8000/admin/登入後台,輸入帳號密碼登錄:
    https://ithelp.ithome.com.tw/upload/images/20190909/20102269K9NIetUdcB.jpg

    • 後台畫面:
      https://ithelp.ithome.com.tw/upload/images/20190909/20102269R7wUqx88Po.jpg
  • sign\views.py路徑修改新增如下圖程式碼:
    https://ithelp.ithome.com.tw/upload/images/20190909/20102269UCT2Q0upOT.jpg

    • 程式碼如下:
    from django.shortcuts import render
    from django.http import HttpResponse, HttpResponseRedirect
    from django.contrib import auth
    from django.contrib.auth.decorators import login_required
    # crate your views here.
    def index(request):
        return render(request,"index.html")
    
    def login_page(request):
        if request.method == 'POST':
            id = request.POST.get('id','')
            password = request.POST.get('password','')
            user = auth.authenticate(username=id,password=password)
            if user is not None:
                auth.login(request,user) #登錄要求
                request.session['user'] = id #新增session,並對應user值為id
                response = HttpResponseRedirect('login_ok/')  #新增
                #response.set_cookie('user',id,3600)  #新增cookie
                return response
            else:
                return render(request,"index.html",{'error':'帳號或密碼輸入錯誤'})
    @login_required  #防止路徑直接訪問
    def login_ok(request):
        #id = request.COOKIES.get('user','') #讀取cookie
        id = request.session.get('user','') #讀取瀏覽器session
        return render(request,'login_ok.html',{'user':id})
    
    • 上述程式碼@login_required #防止路徑直接訪問,可以防止如下圖,別人直接輸入路徑就成功登錄的狀況:
      • 註解此行程式碼#@login_required #防止路徑直接訪問,可直接訪問。
        https://ithelp.ithome.com.tw/upload/images/20190909/201022692xQRKXUJTL.jpg
      • 註解拿掉,再度訪問(請用無痕模式或刪除cookie),可以見到訪問被拒絕,並顯示如下圖:
        https://ithelp.ithome.com.tw/upload/images/20190909/20102269gAwMGmbJPH.jpg

上一篇
來個Django Web介面測試吧:Day07-Django 視圖(view)之3
下一篇
來個Django Web介面測試吧:Day09-Django 模型(model)之1
系列文
來個Django Web介面測試吧30

尚未有邦友留言

立即登入留言