Flask приложение: Проблема с аутентификацией пользователя, возвращающая “500 Внутренняя ошибка сервера”

Вопрос или проблема

Я создаю простое приложение Flask для регистрации пользователей и аутентификации с базой данных PostgreSQL. Я хочу, чтобы приложение аутентифицировало пользователей, проверяя их электронную почту и пароль. Однако при попытке войти я постоянно получаю ошибку “500 Internal Server Error”.

Код
Ниже приведен минимальный воспроизводимый пример моего приложения Flask, сосредоточенный на функции входа.

from flask import Flask, request, jsonify
from flask_cors import CORS
import psycopg2
import bcrypt

app = Flask(__name__)
CORS(app)

DATABASE = {
    'dbname': 'blacklist_db',
    'user': 'postgres',
    'password': 'Project31$',  # Замените на ваш актуальный пароль
    'host': 'localhost',
    'port': '5432'
}

def connect_db():
    try:
        conn = psycopg2.connect(
            dbname=DATABASE['dbname'],
            user=DATABASE['user'],
            password=DATABASE['password'],
            host=DATABASE['host'],
            port=DATABASE['port']
        )
        return conn
    except Exception as e:
        print(f"Ошибка подключения к базе данных: {e}")
        return None

@app.route('/login', methods=['POST'])
def login():
    data = request.json
    email = data.get('email')
    password = data.get('password')

    conn = connect_db()
    if conn is None:
        return jsonify({'message': 'Ошибка подключения к базе данных'}), 500

    try:
        cursor = conn.cursor()
        query = "SELECT password_hash FROM Masters WHERE email = %s"
        cursor.execute(query, (email,))
        user = cursor.fetchone()

        print("Данные пользователя получены:", user)  # Отладочная строка

        if user and user[0] is not None:
            if bcrypt.checkpw(password.encode('utf-8'), user[0]):
                return jsonify({'message': 'Вход выполнен успешно'}), 200
            else:
                return jsonify({'message': 'Неправильная электронная почта или пароль'}), 401
        else:
            return jsonify({'message': 'Неправильная электронная почта или пароль'}), 401

    except Exception as e:
        print(f"Ошибка во время выполнения запроса: {e}")
        return jsonify({'message': 'Ошибка входа'}), 500

    finally:
        cursor.close()
        conn.close()

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

Принятые меры:
Проверено подключение к базе данных — Подключение работает корректно для других маршрутов.
Использовались операторы print для отладки, чтобы убедиться, что данные пользователя получены правильно.
Проверена верификация пароля bcrypt — Добавлены операторы print, чтобы узнать, правильно ли пароль захеширован и сопоставлен.

Дополнительная информация для отладки:
Я проверил структуру таблицы Masters, и она содержит столбцы electronic почта и password_hash.
Я попытался добавить операторы print() внутри функции входа, и пользователь возвращает None, даже когда предоставляются действительные учетные данные.

Вот чего я ожидаю:

Когда пользователь вводит действительную электронную почту и пароль, он должен быть аутентифицирован и успешно войти в систему.
Если электронная почта или пароль неверны, приложение должно вернуть соответствующее сообщение об ошибке, не вызывая ошибку сервера.

Детали ошибки:
В настоящее время при входе я получаю следующую ошибку: 500 Internal Server Error

Ответ или решение

Проблема аутентификации пользователей во Flask-приложении: Ошибка "500 Internal Server Error"

Введение

При разработке Flask-приложения для регистрации и аутентификации пользователей часто возникают различные ошибки, одной из которых является "500 Internal Server Error". Данная проблема может возникать в процессе аутентификации пользователей при выполнении SQL-запросов или неправильной обработке данных. В этой статье мы подробно разберем возможные причины возникновения данной ошибки в вашем коде, а также предложим решения.

Исходный код

Ваша логика аутентификации пользователей представлена в следующем коде:

from flask import Flask, request, jsonify
from flask_cors import CORS
import psycopg2
import bcrypt

app = Flask(__name__)
CORS(app)

DATABASE = {
    'dbname': 'blacklist_db',
    'user': 'postgres',
    'password': 'Project31$',  # Замените на ваш актуальный пароль
    'host': 'localhost',
    'port': '5432'
}

def connect_db():
    try:
        conn = psycopg2.connect(
            dbname=DATABASE['dbname'],
            user=DATABASE['user'],
            password=DATABASE['password'],
            host=DATABASE['host'],
            port=DATABASE['port']
        )
        return conn
    except Exception as e:
        print(f"Ошибка подключения к базе данных: {e}")
        return None

@app.route('/login', methods=['POST'])
def login():
    data = request.json
    email = data.get('email')
    password = data.get('password')

    conn = connect_db()
    if conn is None:
        return jsonify({'message': 'Ошибка подключения к базе данных'}), 500

    try:
        cursor = conn.cursor()
        query = "SELECT password_hash FROM Masters WHERE email = %s"
        cursor.execute(query, (email,))
        user = cursor.fetchone()

        print("Данные пользователя:", user)  # Отладочная строка

        if user and user[0] is not None:
            if bcrypt.checkpw(password.encode('utf-8'), user[0]):
                return jsonify({'message': 'Успешный вход'}), 200
            else:
                return jsonify({'message': 'Неверный email или пароль'}), 401
        else:
            return jsonify({'message': 'Неверный email или пароль'}), 401

    except Exception as e:
        print(f"Ошибка во время выполнения запроса: {e}")
        return jsonify({'message': 'Ошибка входа'}), 500

    finally:
        cursor.close()
        conn.close()

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

Анализ проблемы

  1. Получение данных из базы данных
    Функция login() использует метод fetchone(), чтобы получить запись о пользователе. Если запрос не возвращает ни одной записи (например, из-за неправильного email), переменная user будет равна None, что и приводит к ошибке.

  2. Ошибка подключения к БД
    Такие проблемы могут возникать, если в базе данных отсутствует таблица Masters или в ней нет правильных записей. Убедитесь, что структура таблицы корректна и данные о пользователях заполнены.

  3. Неправильная обработка данных
    Вы не обрабатываете ошибку, связанную с отсутствием data в запросе. Это может привести к ситуации, когда ваш код пытается получить значение из NoneType, вызывая ошибку.

  4. Отладка
    Если вы видите, что пользовательские данные недоступны, или возвращается None, добавление отладочной информации может помочь понять, почему запрос не возвращает ожидаемое значение.

Решение

  1. Проверка наличия данных
    Обязательно проверьте, что data содержит необходимые ключи:

    if not data or 'email' not in data or 'password' not in data:
       return jsonify({'message': 'Некорректный запрос'}), 400
  2. Отладка запросов
    Добавьте отладочные print() для отслеживания значений email и user:

    print(f"Email: {email}")
    print(f"User data retrieved: {user}")
  3. Корректная обработка исключений
    Убедитесь, что ваш блок except обрабатывает все возможные исключения, которые могут возникнуть.

  4. Ошибки с bcrypt
    Проверьте, что хеш пароля действительно находится в базе данных и соответствует требованиями bcrypt.

Заключение

Ошибки аутентификации в Flask-приложении могут быть разнообразными, и "500 Internal Server Error" часто является следствием некорректной обработки данных. Проверьте каждую часть кода, используя отладочные сообщения, чтобы обеспечить наилучший пользовательский опыт. Оптимизация кода и тщательная обработка ошибок помогут избежать подобных проблем в будущем и сделать ваше приложение более устойчивым к сбоям.

Оцените материал
Добавить комментарий

Капча загружается...