在Python Flask框架中开发用户登录、注册、校验等功能,并将用户数据存储到MySQL数据库,一般会涉及以下几个核心步骤:

初始化项目与依赖

首先,确保安装了Flask和其他必要库,如Flask-SQLAlchemy(用于连接MySQL数据库)和Flask-WTF(用于处理表单):

pip install flask flask-sqlalchemy flask-wtf mysqlclient

创建 Flask 应用与配置数据库连接

from flask import Flask, render_template, redirect, url_for, request
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'  # 用于加密表单令牌
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/dbname'
db = SQLAlchemy(app)

# 初始化数据库模型,例如 User 模型
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password_hash = db.Column(db.String(128), nullable=False)

# ... (更多关于模型的字段和方法定义)

创建用户注册表单

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
    submit = SubmitField('Sign Up')

# 注册视图函数
@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        # 将密码哈希存储,不存储明文密码
        hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
        new_user = User(username=form.username.data, email=form.email.data, password_hash=hashed_password)
        db.session.add(new_user)
        db.session.commit()
        return redirect(url_for('login'))
    return render_template('register.html', form=form)

用户登录表单和视图函数

class LoginForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Log In')

# 登录视图函数
@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user and bcrypt.check_password_hash(user.password_hash, form.password.data):
            # 登录成功,使用 Flask-Login 或类似库进行会话管理
            login_user(user)
            return redirect(url_for('home'))  # 跳转到主页或其他受保护的页面
        else:
            flash('Invalid email or password')  # 显示错误信息
    return render_template('login.html', form=form)

数据库迁移与模型同步

在实际项目中,你可能还需要使用Alembic进行数据库迁移,确保模型变化时数据库表结构也能同步更新。

错误处理与用户验证逻辑

上述代码简化了验证逻辑,实际开发中应增加更多的验证,如邮箱格式验证、用户名唯一性验证等。同时,登录失败时应当处理好异常,避免泄露过多信息。

HTML模板和表单渲染

创建HTML模板文件,如register.htmllogin.html,用来呈现表单并与用户交互。

安全措施

为了提高安全性,还需要对密码进行哈希存储,这里使用了bcrypt库。在实际场景中,可能还需要考虑使用CSRF保护、HTTPS、二次验证等额外安全措施。

请根据实际情况调整代码,补充缺少的部分,并注意在生产环境中使用合适的数据库连接池、错误处理和日志记录策略。