會員登入系統

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

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

pip install mysql-connector-python

建立 session 目錄

會員登入系統包含了 login, login_process, logout 等功能,所以請先建立 session 目錄,請在 Terminal 執行如下指令

python manager.py startapp session

設定連結

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

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

login.html

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

form 的後面,要加 csrf_token

完整內容如下

<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- action url 最後一定要加 "/" -->
<form action="/login_process/" method="post">{% csrf_token %}
<table border="1" cellspacing="0" cellpadding="0" align="center">
<tr>
<td colspan="2" align="center">會員登入系統</td>
</tr>
<tr>
<td width="50">帳號</td>
<td>
<input type="text" name="userAccount">
</td>
</tr>
<tr>
<td>密碼</td>
<td>
<input type="password" name="userPassword"/>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="登入">
</td>
</tr>
</table>
</form>
</body>
</html>

login

session/views.py 中,新增 login() 函數,直接載入模板中的 login.html 即可

def login(request):
    return render(request, 'login.html')

login_process

request.POST[‘xxx’] 可接收來自 login.html 表單中的資料,利用這些資料查詢資料庫是否有此帳密,如果沒有就重新載入模板的 login.html。

如果查詢有此帳號,先設定 session,然後 redirect() 重導到首頁。

request.session[“userAccount”] 可以橫跨不同的網頁,也就是在其它的網頁同樣可查到此變數。如果在其它網頁 if ‘userAccount’ in request.session 為 True,就表示已登入,如果為 False 則重導到 login 網頁。

def login_process(request):
    userAccount=request.POST['userAccount']
    userPassword=request.POST['userPassword']
    conn=mysql.connect(
        host=G.dbHost,
        user=G.dbAccount,
        password=G.dbPassword,
        database=G.db
    )
    cursor=conn.cursor()
    cursor.execute(
        f"select * from 會員資料 where userAccount='{userAccount}' and userPassword='{userPassword}'"
    )
    rs=cursor.fetchall()
    conn.close()
    if len(rs)>0:
        request.session['userAccount']=userAccount
        return redirect('/')
    else:
        return render(request, 'login.html')

Login 失敗

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

logout

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

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

session/views.py 完整代碼

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

from django.shortcuts import render, redirect
import mysql.connector as mysql
from G import G
def login(request):
    return render(request, 'login.html')
def login_process(request):
    userAccount=request.POST['userAccount']
    userPassword=request.POST['userPassword']
    conn=mysql.connect(
        host=G.dbHost,
        user=G.dbAccount,
        password=G.dbPassword,
        database=G.db
    )
    cursor=conn.cursor()
    cursor.execute(
        f"select * from 會員資料 where userAccount='{userAccount}' and userPassword='{userPassword}'"
    )
    rs=cursor.fetchall()
    conn.close()
    if len(rs)>0:
        request.session['userAccount']=userAccount
        return redirect('/')
    else:
        return render(request, 'login.html')
def logout(request):
    del request.session['userAccount']
    return redirect('/login')

登出選單

登出選單出現的時機

todo

currentPage

返回登入前的網頁

todo

發佈留言

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