快速定位登錄問題,讓用戶愉快登錄——Python實現登錄rightfind

一、選用合適的登錄方式

如何選擇用戶登錄時的驗證方式?在選擇驗證方式時,需要綜合考慮安全性、易用性和可擴展性等因素。目前常用的驗證方式有密碼驗證、驗證碼驗證、手機號驗證及社交賬號驗證等多種方式,根據不同場景的需求來選擇合適的驗證方式。

以密碼驗證為例,在寫登錄代碼之前,需先做好安全性考慮。密碼需要進行加密處理,可以使用Python內置庫hashlib中的sha256方法進行加密。在登錄時,將用戶輸入的密碼同數據庫中的加密後密碼進行比對,來完成登錄驗證。

import hashlib

def encrypt_password(password):
    return hashlib.sha256(password.encode('utf-8')).hexdigest()

加密密碼函數已完成,接下來我們需要將函數應用到具體的登錄代碼中:

from flask import (Blueprint, jsonify,
                   request, current_app)
from app.models import User
from app.extensions import db
from app.utils.auth import generate_token, login_required

bp_auth = Blueprint('auth', __name__, url_prefix='/auth')


@bp_auth.route('/login', methods=['POST'])
def login():
    try:
        email = request.json.get('email').strip().lower()
        password = request.json.get('password').strip()
        user = User.query.filter_by(email=email).first()

        if user and encrypt_password(password) == user.password_hash:
            token = generate_token(user.id)
            return jsonify({'token': token, 'user': user.to_dict()}), 200
        else:
            return jsonify({'msg': '用戶名或密碼錯誤'}), 401
    except Exception as e:
        current_app.logger.error(e)
        return jsonify({'msg': '未知錯誤,請聯繫開發人員'}), 500

二、增加友好的錯誤提示

當用戶在登錄時出現一些問題時,及時給出針對性的錯誤提示,可以大大提高用戶體驗。比如提示用戶賬號或密碼錯誤,或者是用戶名不存在等等。

在具體代碼實現上,在完成用戶輸入驗證之後,可以使用Flask框架中的flask_flash函數進行錯誤提示。同時也可以在html模板中使用Jinja2模板引擎來渲染並顯示錯誤信息。

from flask import (Blueprint, jsonify, flash,
                   request, current_app, redirect, url_for)
from app.models import User
from app.extensions import db
from app.utils.auth import generate_token, login_required

bp_auth = Blueprint('auth', __name__, url_prefix='/auth')


@bp_auth.route('/login', methods=['POST'])
def login():
    try:
        email = request.json.get('email').strip().lower()
        password = request.json.get('password').strip()
        user = User.query.filter_by(email=email).first()

        if user and encrypt_password(password) == user.password_hash:
            token = generate_token(user.id)
            flash('歡迎回來!')
            return jsonify({'token': token, 'user': user.to_dict()}), 200
        else:
            flash('用戶名或密碼錯誤')
            return redirect(url_for('auth.login')), 401
    except Exception as e:
        current_app.logger.error(e)
        return jsonify({'msg': '未知錯誤,請聯繫開發人員'}), 500

上面代碼中,如果登錄成功,就會把”歡迎回來!”提示信息傳遞到前端;如果登錄失敗,就會把”用戶名或密碼錯誤”提示信息傳遞到前端,並且跳轉到登錄頁面。

三、添加登錄日誌

針對一些特殊需求,可能需要記錄用戶的登錄歷史,這樣可以及時發現登錄異常情況,進行針對性的處理。

實現這一功能的代碼如下:

from datetime import datetime
from flask import (Blueprint, jsonify, flash,
                   request, current_app, redirect, url_for)
from app.models import User, LoginLog
from app.extensions import db
from app.utils.auth import generate_token, login_required

bp_auth = Blueprint('auth', __name__, url_prefix='/auth')


@bp_auth.route('/login', methods=['POST'])
def login():
    try:
        email = request.json.get('email').strip().lower()
        password = request.json.get('password').strip()
        user = User.query.filter_by(email=email).first()

        if user and encrypt_password(password) == user.password_hash:
            token = generate_token(user.id)
            log = LoginLog(
                user_id=user.id,
                ip=request.remote_addr,
                user_agent=request.user_agent.string,
                login_time=datetime.now(),
                status=True
            )
            db.session.add(log)
            db.session.commit()
            flash('歡迎回來!')
            return jsonify({'token': token, 'user': user.to_dict()}), 200
        else:
            log = LoginLog(
                user_id=user.id if user else None,
                ip=request.remote_addr,
                user_agent=request.user_agent.string,
                login_time=datetime.now(),
                status=False
            )
            db.session.add(log)
            db.session.commit()
            flash('用戶名或密碼錯誤')
            return redirect(url_for('auth.login')), 401
    except Exception as e:
        current_app.logger.error(e)
        return jsonify({'msg': '未知錯誤,請聯繫開發人員'}), 500

上述代碼中,我們在登錄成功和登錄失敗的情況下,都在數據庫中添加一條登錄記錄。這裡的LoginLog是一個ORM類,用來映射到數據庫中的login_log表。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/239540.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:17
下一篇 2024-12-12 12:17

相關推薦

  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智能等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • 如何解決WPS保存提示會導致宏不可用的問題

    如果您使用過WPS,可能會碰到在保存的時候提示「文件中含有宏,保存將導致宏不可用」的問題。這個問題是因為WPS在默認情況下不允許保存帶有宏的文件,為了解決這個問題,本篇文章將從多個…

    編程 2025-04-29
  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Java Thread.start() 執行幾次的相關問題

    Java多線程編程作為Java開發中的重要內容,自然會有很多相關問題。在本篇文章中,我們將以Java Thread.start() 執行幾次為中心,為您介紹這方面的問題及其解決方案…

    編程 2025-04-29
  • Python爬蟲亂碼問題

    在網絡爬蟲中,經常會遇到中文亂碼問題。雖然Python自帶了編碼轉換功能,但有時候會出現一些比較奇怪的情況。本文章將從多個方面對Python爬蟲亂碼問題進行詳細的闡述,並給出對應的…

    編程 2025-04-29
  • NodeJS 建立TCP連接出現粘包問題

    在TCP/IP協議中,由於TCP是面向位元組流的協議,發送方把需要傳輸的數據流按照MSS(Maximum Segment Size,最大報文段長度)來分割成若干個TCP分節,在接收端…

    編程 2025-04-29
  • 如何解決vuejs應用在nginx非根目錄下部署時訪問404的問題

    當我們使用Vue.js開發應用時,我們會發現將應用部署在nginx的非根目錄下時,訪問該應用時會出現404錯誤。這是因為Vue在刷新頁面或者直接訪問非根目錄的路由時,會認為服務器上…

    編程 2025-04-29
  • Python中接收用戶的輸入

    Python中接收用戶的輸入是一個常見的任務,可以通過多種方式來實現。本文將從以下幾個方面對Python中接收用戶的輸入做詳細闡述。 一、使用input函數接收用戶輸入 Pytho…

    編程 2025-04-29
  • 如何解決egalaxtouch設備未找到的問題

    egalaxtouch設備未找到問題通常出現在Windows或Linux操作系統上。如果你遇到了這個問題,不要慌張,下面我們從多個方面進行詳細闡述解決方案。 一、檢查硬件連接 首先…

    編程 2025-04-29
  • Python折扣問題解決方案

    Python的折扣問題是在計算購物車價值時常見的問題。在計算時,需要將原價和折扣價相加以得出最終的價值。本文將從多個方面介紹Python的折扣問題,並提供相應的解決方案。 一、Py…

    編程 2025-04-28

發表回復

登錄後才能評論