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