為了更好的理解web前后端的工作業務邏輯:本筆記記錄用flask框架編寫的一個最初級的代碼實現簡單的用戶注冊,登錄場景:
初次進入首頁,提示--游客,歡迎參觀,有登錄和注冊選項,
登錄成功后的用戶,會顯示歡迎(比如用admin用戶登錄):
頁面代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首頁</title> </head> <body> {% if session.name %} <h3>您好,歡迎{{ session.name }}!</h3> {% else %} <h3>游客,歡迎參觀<br><a href="login">請登錄</a><br><a href="signin">請注冊</a></h3> {% endif %} </body> </html>
點擊登錄進入登錄頁面
填寫錯誤的用戶名或密碼會有錯誤提示
頁面代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> <form action="/login" method="POST"> <table> <tr> <th colspan="2">用戶登錄</th> </tr> <tr> <th>用戶名</th> <td> <input name="username" type="text" value=""> </td> </tr> <tr> <th>密碼</th> <td> <input name="passwd" type="text" value=""> </td> </tr> <tr> <th colspan="2"> <input name="login" type="submit" value="登錄"> </th> </tr> <tr> <th colspan="2"> 沒有賬號點擊<a href="signin">注冊</a> </th> </tr> 沒有賬號點擊<a href="signin">注冊</a> </table> {{ msg }} </form> </body> </html>
沒有賬號可點擊注冊進入注冊頁面
注冊信息輸入不完整會有相關提示:
頁面代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注冊</title> </head> <body> <form action="/signin" method="POST"> <table> <tr> <th colspan="2">用戶注冊</th> </tr> <tr> <th>用戶名</th> <td> <input name="username" type="text" value=""> </td> </tr> <tr> <th>密碼</th> <td> <input name="passwd" type="text" value=""> </td> </tr> <tr> <th>確認密碼</th> <td> <input name="passwd1" type="text" value=""> </td> </tr> <tr> <th colspan="2"> <input name="login" type="submit" value="注冊"> </th> </tr> </table> {{ msg }} </form> </body> </html>
注冊成功后會跳轉至注冊成功頁面,點擊立即登錄可跳轉至登錄頁面:
框架代碼如下:
# -*- coding: utf-8 -*- # @Time : 2019/4/28 20:39 # @Author : lc from flask import Flask, render_template, request, session, redirect, url_for from Flask2.sqlite import sqlite_insert, sqlite_select import sqlite3 # 引入數據庫 app = Flask(__name__) # 創建一個Flask實例 app.secret_key = 'abcde11ef' # 設置session密鑰 '''根路由支持POST和GET請求,進入index頁面''' @app.route('/', methods=['GET', 'POST']) def hello_world(): return render_template('index.html') '''注冊支持POST和GET請求,進入signin頁面,合法的注冊數據寫入數據庫''' @app.route('/signin', methods=['GET', 'POST']) def signin(): method = request.method # 獲取請求方式 if method == 'GET': return render_template('signin.html') else: user_name = request.form.get('username') password = request.form.get('passwd') password1 = request.form.get('passwd1') if user_name and password and password1: # 判斷必填項 if password == password1: sqlite_insert(user_name, password) # 實例化數據庫插入方法 succ = "注冊成功" return render_template('signin_success.html', msg=succ) else: err = "登錄失敗,兩次密碼輸入不一致" # 返回HTML可以添加模板語言,可以放在body里面用{{}}引入 return render_template('signin.html', msg=err) else: err = "請輸入完整的注冊信息" return render_template('signin.html', msg=err) # '''登錄支持POST和GET請求,進入login頁面,合法發起請求后查詢數據庫進行數據匹配''' @app.route('/login', methods=['GET', 'POST']) def login(): method = request.method # 獲取請求方式 if method == 'GET': return render_template('login.html') else: username = request.form.get('username') password = request.form.get('passwd') result = sqlite_select(username, password) # 實例化數據庫查詢方法 print(result) if result: if username == result[1] and password == result[2]: session['name'] = result[1] # 設置session值 return render_template('index.html') else: err = "登錄失敗,用戶名或密碼錯誤" # 返回HTML可以添加模板語言,可以放在body里面用{{}}引入 return render_template('login.html', msg=err) if __name__ == '__main__': app.run()
ps:用戶注冊后的密碼會加密后再存入數據庫,可調用以下方法對密碼進行加密
import hashlib def hash_code(pwd): md5=hashlib.md5() # 獲取MD5對象 md5.update(pwd.encode('utf-8')) #將傳入的pwd編碼后,更新MD5的狀態 return md5.hexdigest() #返回十六進制的MD5碼 if __name__ == '__main__': print(hash_code('123456'))
# 輸出結果:e10adc3949ba59abbe56e057f20f883e