【问题标题】:TypeError: tuple indices must be integers or slices, not str --python flask类型错误:元组索引必须是整数或切片,而不是 str --python flask
【发布时间】:2020-03-25 13:33:59
【问题描述】:

我需要使用 python flask 和 Postgres 创建登录和注册。到目前为止,我已经创建了注册,并且在尝试集成登录 api 时出现错误。我已成功将电子邮件、用户名、密码插入到我的数据库中,并且在尝试使用该电子邮件和密码进行验证时,我无法进行登录过程。我想要json格式的token。

运行.py

from app import app
if __name__ == '__main__':
    app.run(debug=True, port=5000)

login.py

from app import app, conn, bcrypt
from flask import request, jsonify
from flask_bcrypt import Bcrypt, check_password_hash
from datetime import datetime
import logging
from flask_jwt_extended import create_access_token

# registration api #################################################33


@app.route('/users/register', methods=['POST'])
def register():

    try:
        cur = conn.cursor()
        first_name = request.get_json()['first_name']
        last_name = request.get_json()['last_name']
        email = request.get_json()['email']
        password = bcrypt.generate_password_hash(
            request.get_json()['password']).decode('utf-8')
        created = datetime.utcnow()

        cur.execute("INSERT INTO admin.admin(first_name,last_name,email,password,created) VALUES('" +
                    str(first_name) + "','" +
                    str(last_name) + "','" +
                    str(email) + "','" +
                    str(password) + "','" +
                    str(created) + "')")
        conn.commit()
        result = {
            "first_name": first_name,
            "last_name": last_name,
            "email": email,
            "password": password,
            "created": created
        }
        return jsonify({"result": result})
    except Exception as e:
        conn.rollback()
        logging.error("db error:{}".format(e))

##########################LOGIN API#######################################


@app.route('/users/login', methods=['POST'])
def login():


        cur = conn.cursor()
        email = request.get_json()['email']
        password = request.get_json()['password']
        result = ""
        cur.execute("SELECT * FROM admin.admin WHERE email='" +
                    str(email) + "'")
        rv = cur.fetchone()

        if bcrypt.check_password_hash(rv['password'], password):

            access_token = create_access_token(identity={'first_name': rv['first_name'], 'last_name': rv['last_name'], 'email': rv['email']})
            result = jsonify({"token": access_token})
        else:
            result = jsonify({"error": "invalid username and password"})
            return result

app.py

from flask import Flask, jsonify, request, json
import psycopg2
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


app = Flask(__name__)
conn = psycopg2.connect(host="localhost", database="practise",
                        user="postgres", password="dbA@pr3mium")
bcrypt = Bcrypt(app)
jwt = JWTManager(app)
CORS(app)

import login

requirements.txt

astroid==2.3.3
autopep8==1.5
bcrypt==3.1.7
cffi==1.14.0
click==7.1.1
colorama==0.4.3
Flask==1.1.1
Flask-Bcrypt==0.7.1
Flask-Cors==3.0.8
Flask-JWT-Extended==3.24.1
Flask-SQLAlchemy==2.4.1
isort==4.3.21
itsdangerous==1.1.0
Jinja2==2.11.1
lazy-object-proxy==1.4.3
MarkupSafe==1.1.1
mccabe==0.6.1
psycopg2==2.8.4
pycodestyle==2.5.0
pycparser==2.20
PyJWT==1.7.1
pylint==2.4.4
six==1.14.0
SQLAlchemy==1.3.15
Werkzeug==1.0.0
wrapt==1.11.2

error occured
127.0.0.1 - - [25/Mar/2020 20:19:56] "POST /users/login HTTP/1.1" 500 -
Traceback (most recent call last):
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask_cors\extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask_cors\extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\sudeep\Desktop\example\venv\Lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\sudeep\Desktop\example\login.py", line 57, in login
    if bcrypt.check_password_hash(rv['password'], password):
TypeError: tuple indices must be integers or slices, not str

【问题讨论】:

  • 请在您的问题中包含完整的异常堆栈跟踪。哪一行会引发该错误?
  • @Brian 我已经包含了错误部分,现在您可以查看

标签: python-3.x postgresql flask-sqlalchemy flask-login


【解决方案1】:

fetchone() 返回一个元组,而不是字典。所以

rv['password']

不起作用。您必须弄清楚索引位置。例如,如果密码在第三位,则将其更改为

rv[2]

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 2018-03-12
    • 2017-03-11
    • 2021-01-18
    • 1970-01-01
    • 2019-11-23
    • 2018-12-29
    • 1970-01-01
    • 2023-02-19
    相关资源
    最近更新 更多