Python-Flask 开发用户登录、注册、校验功能并存储到 MySQL
在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.html
和login.html
,用来呈现表单并与用户交互。
安全措施
为了提高安全性,还需要对密码进行哈希存储,这里使用了bcrypt库。在实际场景中,可能还需要考虑使用CSRF保护、HTTPS、二次验证等额外安全措施。
请根据实际情况调整代码,补充缺少的部分,并注意在生产环境中使用合适的数据库连接池、错误处理和日志记录策略。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Coke(cokeserver@qq.com)
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果