會員登入系統

      在〈會員登入系統〉中尚無留言

會員登入系統包含了表單,資料庫,session 等觀念。開發本範例前,請先安裝如下套件

pip install mysql-connector-python

建立 session 目錄

會員登入系統先建立 session app,請在 Terminal 執行如下指令

python manager.py startapp session

設定連結

開啟根目錄 pyweb 下的 urls.py,新增如下藍色連結

from session import views as session
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home),
    path('login/',session.login),
    path('logout/',session.logout),
]

login.html

請在模板中新增 login_form.html。html 表單的 action=”/login/” 請記得最後一定要加 “/”。

登入的表單網址是 http://xxx/login,那 action 為什麼還是 http://xxx/login 呢? 這是因為在 views.py 中使用 request.method 是 “GET” 或是 “POST” 來判斷是要傳送表單或是處理表。這種設計方式可某程度的干擾駭客該從何處入侵。

請注意在 form 的後面要加 {% csrf_token %}

完整的 html 內容如下

🔒 底下內容僅限會員閱讀。

立即登入

另外請在 templates 裏新增 login_error.html 及 login_reject.html

views.py 架構

session/views.py 中,新增 login() 函數,有三段主要程式。

  • 第一段是判斷 ip 是否被鎖定 : 此段有二個結果,一是未滿二小時,另一是已滿二小時。
  • 第二段是處理傳送表單。
  • 第三段是處理表單進來的資料。
def login(request):
    #ip 鎖定區塊
    if 未滿二小時:
        pass
    else : 已滿二小時
        pass
    
    if request.mothod=="GET":
        #傳送登入表單
    else :
        #處理接收表單的資料
        result = process(request, conn, cursor)
        if result=="login_ok":
            #處理登入成功
        elif result=="login_error":
            #處理登入失敗
        else:
            #處理封鎖 

Login 失敗

如果登入失敗的話,可以使用 time.sleep(3) 睡個三秒,防止機器人暴力破解。睡這三秒鐘,其它人是否會被卡住呢? 答案是不會的,因為每一條連線都是一個執行緒,所以其它人還是正常在運作的。

session 運作方式

Django 在使用者第一次請求時會產生一個 Seesion ID,這個 sessionid 除了會儲存在 Server 的資料庫中,也會傳送給使用者瀏覽器的 Cookie。

當使用者下一次又發送 request,會在 HTTP header 中雜帶 sessionid 給 Server Django,Django 就此 sessionid 判斷是否為同一個使用者(連線)。

若要在客戶端查看 sessionid,可在瀏覽器按下 F12/Application/Cookies,即可看到 sessionid。

request.session 失敗

如果在 Django 設定 request.session[“userAccount”] = userAccount 出現 no such table: django_session,表示 db.sqlite3 這個資料庫少了 django_session 資料表,這通常發生在尚未執行資料庫遷移(migration)時。請使用如下指令建立所有必要的資料表,包括 django_session。

python manage.py migrate

views.py 完整代碼

session/views.py的完整代碼如下

🔒 底下內容僅限會員閱讀。

立即登入

logout

登出只要使用 del request.session[‘userAccount’] 即可將 session 刪除。

def logout(request):
    del request.session['userAccount']
    return redirect('/login')

current page

返回登入前的網頁

todo

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *