Python-使用Flask 製作簡單的登入及登出網站
登入登出對於網站是一件很平凡的事情,不過你瞭解後端是怎麼實現的嗎?來試試看用Python Flask 自己做個簡易的登入登出網站叭~
使用說明
1. 方案一 : 預設方式啟動 Web,需自備 MySQL 及訪問權限
2. 方案二 : 預設方式啟動 Web ,及使用 HowHow 建置的 Database Docker 容器
3. 方案三 : 全部都使用 HowHow DB 及 Web 容器
方案一 | 方案二 | 方案三 |
---|---|---|
手動配置 | 半自動配置 | 全自動配置 |
需自備DB | 無須自備DB | 無須自備DB |
Web lib自行安裝 | Web lib自行安裝 | 無須安裝lib |
無須Docker | 須Docker | 須Docker |
- 程式範例
方案一:
- 相關程式碼均可至GitHub下載
- 可以自行建置客製化HTML
- 需要MySQL(本地或是雲都可以)
-
程式架構
-
MySQL 架構
Database為 db ; Table 為 users pip3 install flaskmysqldb可能會遇到的問題,請拉至最下方
/* 程式碼範例參考 */
/* database */
CREATE DATABASE db
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
/* Table */
CREATE Table users
(
id int not null auto_increment,
name varchar(20) not null,
email varchar(20) not null,
password char(80) not null,
primary key (id)
);
- 主程式碼
# 需要安裝的套件 flask 、 flask_mysqldb 、 bcrypt
# 需要 MySQL 或是 MariaDB
# Mysql table 為 users
# 綱要必須要有 name, email, password
# hash密碼
import bcrypt
# 解析 URL
from urllib import parse
# mysql connector
from flask_mysqldb import MySQL, MySQLdb
# flask
from flask import Flask, render_template, request, redirect, url_for, session
app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost' # 登入ip
app.config['MYSQL_USER'] = 'root' # 登入帳號
app.config['MYSQL_PASSWORD'] = 'root' # 登入密碼
app.config['MYSQL_DB'] = 'db' # 登入資料庫名稱
# app.config['MYSQL_PORT'] = '3306' # Port號(預設就是3306)
mysql = MySQL(app)
# 主頁
@app.route('/')
def home():
return render_template("home.html")
# 註冊頁面
@app.route('/register', methods=["GET", "POST"])
def register():
if request.method == 'GET':
return render_template("register.html")
else:
name = request.form['name']
email = request.form['email']
password = request.form['password'].encode('utf-8')
hash_password = bcrypt.hashpw(password, bcrypt.gensalt())
cur = mysql.connection.cursor()
cur.execute("INSERT INTO users (name, email, password) VALUES (%s,%s,%s)",
(name, email, hash_password))
mysql.connection.commit()
session['name'] = request.form['name']
session['email'] = request.form['email']
return redirect(url_for('home'))
# 登入頁面
@app.route('/login', methods=["GET", "POST"])
def login():
if request.method == 'POST':
email = request.form['email']
password = request.form['password'].encode('utf-8')
curl = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
curl.execute("SELECT * FROM users WHERE email=%s", [email])
user = curl.fetchone()
curl.close()
if user == None:
return "沒有這個帳號"
if len(user) != 0:
if bcrypt.hashpw(password, user["password"].encode('utf-8')) == user["password"].encode('utf-8'):
session['name'] = user['name']
session['email'] = user['email']
return render_template("home.html")
else:
return "您的密碼錯誤"
else:
return render_template("login.html")
# 登出
@app.route('/logout')
def logout():
session.clear()
return render_template("home.html")
if __name__ == '__main__':
app.secret_key = "This is a secret_key"
# 開啟 debug模式比較方便
app.run(debug=True, host='0.0.0.0', port=5000)
- 執行方式
python3 app.py
- 至瀏覽器輸入 IP:5000
安裝mysql套件可能會遇到的問題
因為缺少 libmysqlclient-dev 的C lib,只要apt / yum install就可以了
方案二及方案三 Dokcer 快速部署方式請點我至 GitHub
Docker 快速部署 DEMO
- 一鍵式快速部署
- DB管理介面
- Docker-compose 彈性 Yaml 自行配置
- Dockerfile 免去安裝套件環境問題