subscribe, registration, signup

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
  • 程式範例

方案一:

  1. 相關程式碼均可至GitHub下載
  2. 可以自行建置客製化HTML
  3. 需要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

  1. 一鍵式快速部署

  1. DB管理介面

  1. Docker-compose 彈性 Yaml 自行配置

  1. Dockerfile 免去安裝套件環境問題

部署Flask 到 Nginx (實際生產環境)請點我


如果覺得內容還不錯,請我喝杯咖啡吧~

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。