为什么没有任何用户添加到我的数据库中?

问题描述 投票:0回答:1

我正在为个人项目制作完整的堆栈应用程序。我使用 SQLite、SQLAlchemy 和 Flask 作为后端。我在 models.py 中创建了一个名为“User”的模型,它当然代表注册并使用该应用程序的用户。由于某种原因,每次我进入 Flask shell 并尝试使用 db.session.add() 和 db.session.commit() 将新用户添加到数据库时,根本没有任何内容输入到数据库中!

我认为问题可能在于我如何设置用户密码以使用 bcrpyt 进行哈希处理。下面是我的 config.py 文件,显示了我为后端所做的所有配置

from flask import Flask 
from flask_restful import Api
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import MetaData
from flask_bcrypt import Bcrypt
from dotenv import load_dotenv
import os



app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///app.db"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.json.compact = False

metadata = MetaData(naming_convention={"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",})
db = SQLAlchemy(metadata=metadata)
migrate = Migrate(app,db)
db.init_app(app)

api = Api(app)

bcrypt = Bcrypt(app)

load_dotenv()

app.secret_key = os.getenv("SECRET_KEY")

下面是 models.py 中的“User”模型。提醒一下,我使用 sqlalchemy 作为数据库模型。

from config import db, bcrypt
from sqlalchemy_serializer import SerializerMixin
from sqlalchemy.ext.associationproxy import association_proxy


class User(db.Model, SerializerMixin):
    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String, nullable = False)
    email = db.Column(db.String, nullable = False)
    _password_hash = db.Column(db.String, nullable = False)

    def get_password_hash(self):
        return self._password_hash
    
    def set_password_hash(self, newPassword):
        byteObject = newPassword.encode("utf-8")
        newHash = bcrypt.generate_password_hash(byteObject)
        hashAsString = newHash.decode("utf-8")
        self._password_hash = hashAsString

    _password_hash = property(get_password_hash, set_password_hash)
        


    
    def authenticate(self, passedString):
        return bcrypt.check_password_hash(self._password_hash, passedString.encode("utf-8"))
    
    def __repr__(self):
        return f'ID: {self.id}, Username: {self.username}'

非常感谢任何帮助。

尝试编辑密码哈希功能,但仍然出现错误,未将用户添加到数据库

python flask sqlalchemy flask-sqlalchemy
1个回答
0
投票

你所做的与我学习的方式有点不同。对于初学者来说,您可能需要导入 sqlite3。我从未使用过您代码的元数据部分,但您应该将您的应用程序传递给数据库设置:

import sqlite3
db = SQLAlchemy(app)

我并不是说它不能完成,但我从未见过在数据库模型内完成密码散列。该模型告诉应用程序在数据库中期望什么。我建议将密码散列移动到添加用户路由,并将散列从那里提交到数据库。我为此使用了 WTForms 并创建了一个用户表单。希望您可以根据您的具体用例修改它。

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField, ValidationError
from wtforms.validators import DataRequired, EqualTo

# User form class
class UserForm(FlaskForm):
    name = StringField('Name:', validators=[DataRequired()])
    username = StringField('Username:', validators=[DataRequired()])
    email = StringField('Email:', validators=[DataRequired()])
    color = StringField('Favorite Color:', validators=[DataRequired()])
    pw_hash = PasswordField('Password:', validators=[DataRequired(), EqualTo('pw_hash2', message='Passwords must match!')])
    pw_hash2 = PasswordField('Confirm Password:', validators=[DataRequired()])
    submit = SubmitField('Submit')    

# Add user page route
@app.route('/add_user', methods=["GET", "POST"])
def add_user():
  name = None
  form = UserForm()
  if form.validate_on_submit():
    user = Users.query.filter_by(email=form.email.data).first()
    if user is None:
      # Hash the password
      hashed_pw = generate_password_hash(form.pw_hash.data, method='pbkdf2', salt_length=16)
      user = Users(username=form.username.data, name=form.name.data, email=form.email.data, color=form.color.data, pw_hash=hashed_pw)
      db.session.add(user)
      db.session.commit()
    name = form.name.data
    # clear the form
    form.username.data = ''
    form.name.data = ''
    form.email.data = ''
    form.color.data = ''
    form.pw_hash.data = ''
    flash("User Added Successfully")
  our_users = Users.query.order_by(Users.date_added)
  return render_template('add_user.html', form=form, name=name, our_users=our_users)
© www.soinside.com 2019 - 2024. All rights reserved.