欢迎访问宙启技术站
智能推送

在Python中使用Flask-WTF和SQLite实现用户注册和登录表单的完整指南

发布时间:2023-12-24 22:20:18

在Python中使用Flask-WTF和SQLite实现用户注册和登录表单的完整指南如下所示:

步骤1:安装所需的依赖

首先,我们需要安装Flask和Flask-WTF库。可以使用以下命令来安装这些库:

pip install Flask
pip install Flask-WTF

同时我们还需要安装SQLite数据库。SQLite是一种轻量级的数据库引擎,不需要额外的服务器支持。

步骤2:创建一个基本应用

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

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)

    def __repr__(self):
        return f"User('{self.username}', '{self.email}')"

db.create_all()

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')

    def validate_username(self, username):
        user = User.query.filter_by(username=username.data).first()
        if user:
            raise ValidationError('Username is already taken.')

    def validate_email(self, email):
        user = User.query.filter_by(email=email.data).first()
        if user:
            raise ValidationError('Email is already registered.')

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

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        user = User(username=form.username.data, email=form.email.data, password=form.password.data)
        db.session.add(user)
        db.session.commit()
        return redirect(url_for('login'))
    return render_template('register.html', form=form)

@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 user.password == form.password.data:
            return redirect(url_for('home'))
    return render_template('login.html', form=form)

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

在上述示例中,我们首先创建了一个基本的Flask应用,并配置了一个秘密密钥和SQLite数据库的URI。

然后,我们定义了一个User类作为数据库模型,用于存储用户的用户名、邮箱和密码。

接下来,我们创建了一个RegistrationForm类和一个LoginForm类,通过继承FlaskForm类来创建这些表单类。我们使用不同的验证函数来验证表单的字段,例如必填字段、电子邮件格式和密码匹配等。

在应用的路由中,我们定义了一个主页路由和两个注册和登录路由。在这些路由中,我们对表单进行验证,如果验证通过,则将用户信息保存到数据库中,并重定向到登录页面或主页。

步骤3:创建模板文件

我们还需要创建一些HTML模板文件,以便在应用中使用这些模板。下面是一些示例模板文件的内容。

index.html:

<!DOCTYPE html>
<html>
<head>
    <title>Home - My App</title>
</head>
<body>
    <h1>Welcome to My App</h1>
    <p>This is the home page.</p>
</body>
</html>

register.html:

<!DOCTYPE html>
<html>
<head>
    <title>Register - My App</title>
</head>
<body>
    <h1>Register</h1>
    <form method="POST" action="{{ url_for('register') }}">
        {{ form.csrf_token }}
        {{ form.username.label }} {{ form.username }}<br>
        {{ form.email.label }} {{ form.email }}<br>
        {{ form.password.label }} {{ form.password }}<br>
        {{ form.confirm_password.label }} {{ form.confirm_password }}<br>
        {{ form.submit }}
    </form>
    {% if form.errors %}
        <div>
            {% for field, errors in form.errors.items() %}
                {% for error in errors %}
                    <p>{{ error }}</p>
                {% endfor %}
            {% endfor %}
        </div>
    {% endif %}
</body>
</html>

login.html:

<!DOCTYPE html>
<html>
<head>
    <title>Login - My App</title>
</head>
<body>
    <h1>Login</h1>
    <form method="POST" action="{{ url_for('login') }}">
        {{ form.csrf_token }}
        {{ form.email.label }} {{ form.email }}<br>
        {{ form.password.label }} {{ form.password }}<br>
        {{ form.submit }}
    </form>
    {% if form.errors %}
        <div>
            {% for field, errors in form.errors.items() %}
                {% for error in errors %}
                    <p>{{ error }}</p>
                {% endfor %}
            {% endfor %}
        </div>
    {% endif %}
</body>
</html>

在这些模板文件中,我们使用Flask模板引擎来渲染表单的字段以及错误消息。我们通过使用url_for函数来生成带有正确路由的表单提交URL。

步骤4:运行应用

最后,我们可以运行应用并尝试注册和登录功能:

$ python app.py

上述代码会启动一个基本的Flask应用,并监听在本地的5000端口。

访问http://localhost:5000/,即可在浏览器上看到主页。

点击注册链接,即可访问注册页面,输入所需的信息并提交表单。

然后,您可以转到登录页面,并使用刚才注册的凭据进行登录。

这就是使用Flask-WTF和SQLite实现用户注册和登录表单的完整指南。希望这个指南对您有所帮助!