实现一个简单的Web应用程序:使用Flask和SQLite进行用户注册与登录

03-05 44阅读
󦘖

免费快速起号(微信号)

coolyzf

添加微信

在现代的Web开发中,用户注册和登录是许多应用程序的核心功能。无论是一个博客平台、社交网络还是电子商务网站,确保用户能够安全地注册并登录是至关重要的。本文将介绍如何使用Python的Flask框架和SQLite数据库来构建一个简单的用户注册和登录系统。我们将逐步实现这些功能,并通过代码示例来说明每个步骤。

环境准备

首先,我们需要安装必要的依赖库。你可以使用pip来安装这些库:

pip install Flask Flask-SQLAlchemy Flask-WTF

接下来,我们创建一个虚拟环境并激活它(推荐的做法),以避免与其他项目产生冲突:

python -m venv venvsource venv/bin/activate  # Linux/MacOSvenv\Scripts\activate     # Windows

项目结构

为了保持项目的整洁,我们将按照以下结构组织文件:

flask_app/│├── app.py                # 主应用文件├── models.py            # 数据库模型定义├── forms.py             # 表单定义├── templates/│   ├── base.html        # 基础模板│   ├── register.html    # 注册页面│   ├── login.html       # 登录页面│   └── dashboard.html   # 用户仪表盘页面└── static/    └── style.css        # 样式表

配置Flask应用

app.py中,我们初始化Flask应用,并配置数据库连接和其他设置:

from flask import Flask, render_template, redirect, url_for, flashfrom flask_sqlalchemy import SQLAlchemyfrom flask_wtf import FlaskFormfrom wtforms import StringField, PasswordField, SubmitFieldfrom wtforms.validators import DataRequired, Length, EqualTo, Emailfrom werkzeug.security import generate_password_hash, check_password_hashfrom flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_userapp = Flask(__name__)app.config['SECRET_KEY'] = 'your_secret_key'app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'db = SQLAlchemy(app)login_manager = LoginManager(app)@login_manager.user_loaderdef load_user(user_id):    return User.query.get(int(user_id))class User(UserMixin, db.Model):    id = db.Column(db.Integer, primary_key=True)    username = db.Column(db.String(150), unique=True, nullable=False)    email = db.Column(db.String(150), unique=True, nullable=False)    password = db.Column(db.String(150), nullable=False)@app.route('/')def home():    return render_template('base.html')if __name__ == '__main__':    app.run(debug=True)

定义表单

forms.py中,我们定义用于用户注册和登录的表单类:

from flask_wtf import FlaskFormfrom wtforms import StringField, PasswordField, SubmitFieldfrom wtforms.validators import DataRequired, Length, EqualTo, Emailclass RegistrationForm(FlaskForm):    username = StringField('Username', validators=[DataRequired(), Length(min=4, max=15)])    email = StringField('Email', validators=[DataRequired(), Email()])    password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])    confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])    submit = SubmitField('Sign Up')class LoginForm(FlaskForm):    email = StringField('Email', validators=[DataRequired(), Email()])    password = PasswordField('Password', validators=[DataRequired()])    submit = SubmitField('Login')

创建视图函数

app.py中,我们添加处理注册和登录请求的视图函数:

from flask import request, render_template, redirect, url_for, flashfrom .models import Userfrom .forms import RegistrationForm, LoginFormfrom werkzeug.security import generate_password_hash, check_password_hashfrom flask_login import login_user, logout_user, login_required, current_user@app.route('/register', methods=['GET', 'POST'])def register():    if current_user.is_authenticated:        return redirect(url_for('dashboard'))    form = RegistrationForm()    if form.validate_on_submit():        hashed_password = generate_password_hash(form.password.data, method='sha256')        new_user = User(username=form.username.data, email=form.email.data, password=hashed_password)        db.session.add(new_user)        db.session.commit()        flash('Your account has been created! You can now log in.', 'success')        return redirect(url_for('login'))    return render_template('register.html', title='Register', form=form)@app.route('/login', methods=['GET', 'POST'])def login():    if current_user.is_authenticated:        return redirect(url_for('dashboard'))    form = LoginForm()    if form.validate_on_submit():        user = User.query.filter_by(email=form.email.data).first()        if user and check_password_hash(user.password, form.password.data):            login_user(user)            return redirect(url_for('dashboard'))        else:            flash('Login Unsuccessful. Please check email and password.', 'danger')    return render_template('login.html', title='Login', form=form)@app.route('/logout')@login_requireddef logout():    logout_user()    return redirect(url_for('home'))@app.route('/dashboard')@login_requireddef dashboard():    return render_template('dashboard.html', title='Dashboard')

创建HTML模板

接下来,我们在templates目录下创建HTML模板文件。首先,创建一个基础模板base.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>{% block title %}Home{% endblock %}</title>    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"></head><body>    <nav>        <a href="{{ url_for('home') }}">Home</a>        {% if current_user.is_authenticated %}            <a href="{{ url_for('dashboard') }}">Dashboard</a>            <a href="{{ url_for('logout') }}">Logout</a>        {% else %}            <a href="{{ url_for('register') }}">Register</a>            <a href="{{ url_for('login') }}">Login</a>        {% endif %}    </nav>    <div class="container">        {% with messages = get_flashed_messages(with_categories=true) %}            {% if messages %}                {% for category, message in messages %}                    <div class="alert {{ category }}">{{ message }}</div>                {% endfor %}            {% endif %}        {% endwith %}        {% block content %}{% endblock %}    </div></body></html>

然后,创建register.htmllogin.htmldashboard.html模板文件:

register.html

{% extends "base.html" %}{% block title %}Register{% endblock %}{% block content %}    <h3>Register</h3>    <form method="POST">        {{ form.hidden_tag() }}        <div>            {{ form.username.label }}<br>            {{ form.username(size=32) }}        </div>        <div>            {{ form.email.label }}<br>            {{ form.email(size=32) }}        </div>        <div>            {{ form.password.label }}<br>            {{ form.password(size=32) }}        </div>        <div>            {{ form.confirm_password.label }}<br>            {{ form.confirm_password(size=32) }}        </div>        <div>            {{ form.submit() }}        </div>    </form>{% endblock %}

login.html

{% extends "base.html" %}{% block title %}Login{% endblock %}{% block content %}    <h3>Login</h3>    <form method="POST">        {{ form.hidden_tag() }}        <div>            {{ form.email.label }}<br>            {{ form.email(size=32) }}        </div>        <div>            {{ form.password.label }}<br>            {{ form.password(size=32) }}        </div>        <div>            {{ form.submit() }}        </div>    </form>{% endblock %}

dashboard.html

{% extends "base.html" %}{% block title %}Dashboard{% endblock %}{% block content %}    <h3>Welcome, {{ current_user.username }}!</h3>    <p>This is your dashboard.</p>{% endblock %}

运行应用程序

最后,确保数据库已经创建并迁移:

flask shell>>> from app import db>>> db.create_all()

现在,你可以运行应用程序:

python app.py

打开浏览器并访问http://127.0.0.1:5000,你应该能够看到一个简单的用户注册和登录界面。

通过上述步骤,我们成功地构建了一个基本的用户注册和登录系统。这个系统使用了Flask作为Web框架,SQLite作为数据库,并且实现了用户认证的基本功能。当然,这只是一个起点。在实际应用中,你可能需要添加更多的功能,如密码重置、用户角色管理等。希望这篇文章能为你提供一个良好的起点,帮助你在Web开发的道路上更进一步。

免责声明:本文来自网站作者,不代表ixcun的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:aviv@vne.cc
您是本站第7119名访客 今日有37篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!