TypeError: объект 'NoneType' не может быть подписан в приложении Flask, mysql - PullRequest
0 голосов
/ 02 августа 2020

Я создаю приложение для входа, используя Flask - mysql.

from flask import Flask, jsonify, request, json
from flask_mysqldb import MySQL
from datetime import datetime
from flask_cors import CORS
from flask_bcrypt import Bcrypt
from flask_jwt_extended import JWTManager
from flask_jwt_extended import (create_access_token, create_refresh_token, jwt_required, jwt_refresh_token_required, get_jwt_identity, get_raw_jwt)
import yaml

app = Flask(__name__)
alogin = yaml.load(open('alogin.yaml'))
app.config['MYSQL_HOST']= alogin['mysql_host']
app.config['MYSQL_USER']= alogin['mysql_user']
app.config['MYSQL_PASSWORD']= alogin['mysql_password']
app.config['MYSQL_DB']= alogin['mysql_db']
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'
app.config['JWT_SECRET_KEY'] = 'secret'

mysql = MySQL(app)
bcrypt = Bcrypt(app)
jwt = JWTManager(app)

CORS(app)

@app.route('/alogin', methods=['POST'])
def login():
    cur = mysql.connection.cursor()
    email = request.get_json()['email']
    password = request.get_json()['password']
    result = ""
    
    cur.execute("SELECT * FROM admin where email = '" + str(email) + "'")
    rv = cur.fetchone()
    
    if bcrypt.check_password_hash(rv['password'], password):
        access_token = create_access_token(identity = {'id':rv['id'],'email': rv['email']})
        result = jsonify({"token":access_token})
    else:
        result = jsonify({"error":"Invalid username and password"})
    
    return result


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

Я получаю следующее сообщение об ошибке:

if bcrypt.check_password_hash(rv['password'], password):
TypeError: 'NoneType' object is not subscriptable

Я пробовал использовать ' force = True 'in

    email = request.get_json(force = True)['email']
    password = request.get_json(force = True)['password']

Тем не менее, он выдает ту же ошибку. Это мое первое приложение с flask. Помощь будет принята с благодарностью.

PS: admin - это имя таблицы в базе данных, и я уже создал ее в базе данных mysql.

1 Ответ

2 голосов
/ 02 августа 2020

fetchone() вернет None, если запрос не приводит к данным. Добавьте проверку

if rv is None:

, чтобы обработать случай, когда кто-то предоставляет адрес электронной почты, которого нет в базе данных.

Кроме того, найдите время и найдите "SQL Injection Attack ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...