切換語言為:簡體

如何在 Flask 中實現使用者登入

  • 爱糖宝
  • 2024-08-13
  • 2063
  • 0
  • 0

在 Flask 中實現使用者登入功能通常涉及以下幾個步驟:設定 Flask 應用、建立使用者模型、處理使用者註冊、實現登入邏輯以及保護受限路由。下面就是我總結得一些經驗,可以一起聊一聊。

1、問題背景

在使用 Flask 框架構建 Web 應用程式時,通常需要實現使用者登入功能。常見的需求是將使用者名稱和密碼與資料庫中的資料進行比較,並根據比較結果進行相應的操作。例如,如果使用者名稱不存在,則提示“使用者不存在”;如果密碼不匹配,則提示“密碼錯誤”;如果登入成功,則提示“您已登入”。

2、解決方案

爲了實現上述需求,可以採用以下步驟:

  1. 使用 Flask-SQLAlchemy 與資料庫進行連線。

  2. 使用 bcrypt 模組對密碼進行雜湊處理。

  3. 定義使用者模型並將其對映到資料庫表。

  4. 在登入檢視函式中,從資料庫中查詢使用者名稱和密碼,並與使用者輸入的使用者名稱和密碼進行比較。

  5. 根據比較結果,使用 Flask 的 flash() 函式提示相應的錯誤資訊或成功資訊。

  6. 如果登入成功,則將使用者 ID 儲存在會話中。

以下是一個示例程式碼:

from flask import Flask, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
import bcrypt

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, unique=True)
    password = db.Column(db.String)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = User.query.filter_by(username=request.form['username']).first()
        if not user:
            flash('Invalid username')
        elif bcrypt.hashpw(request.form['password'], user.password) != hashed:
            flash('Invalid password')
        else:
            session['user_id'] = user.id
            flash('You were logged in')
            return redirect(url_for('show_entries'))

    return render_template('login.html')

if __name__ == '__main__':
    app.run()

在上面的程式碼中,我們需要先建立一個數據庫表來儲存使用者的使用者名稱和密碼,可以使用以下命令來建立表:

flask db init
flask db migrate
flask db upgrade

然後,我們需要在應用程式中定義一個使用者模型,並將其對映到資料庫表。可以在 models.py 檔案中定義使用者模型:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, unique=True)
    password = db.Column(db.String)

最後,我們需要在檢視函式中實現登入邏輯。可以在 views.py 檔案中定義檢視函式:

from flask import Flask, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
import bcrypt

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, unique=True)
    password = db.Column(db.String)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = User.query.filter_by(username=request.form['username']).first()
        if not user:
            flash('Invalid username')
        elif bcrypt.hashpw(request.form['password'], user.password) != hashed:
            flash('Invalid password')
        else:
            session['user_id'] = user.id
            flash('You were logged in')
            return redirect(url_for('show_entries'))

    return render_template('login.html')

if __name__ == '__main__':
    app.run()

這樣,我們就實現了使用 Flask-SQLAlchemy 和 bcrypt 模組來實現使用者登入的功能。

透過以上步驟,我們可以在 Flask 應用中實現一個簡單的使用者登入系統。這個示例展示瞭如何使用 Flask-Login 來管理使用者會話,處理登入、登出,並保護受限路由。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.