會員登入系統包含了表單,資料庫,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