使用Python构建一个简单的Web应用:Flask + MySQL 实战
在现代软件开发中,Web 应用程序扮演着极其重要的角色。无论是企业管理系统、社交平台还是电商平台,Web 技术都无处不在。本文将介绍如何使用 Python 的 Flask 框架和 MySQL 数据库来构建一个简单的 Web 应用程序,并通过实际代码演示其完整实现过程。
我们将构建一个“用户注册与登录系统”,包含以下功能:
用户注册用户登录显示所有已注册用户信息技术栈简介
Flask:轻量级的 Python Web 框架,适合快速搭建小型网站或 API。MySQL:关系型数据库,用于存储用户数据。SQLAlchemy:ORM(对象关系映射)工具,简化数据库操作。Jinja2:Flask 默认使用的模板引擎,用于渲染 HTML 页面。Werkzeug:提供密码哈希功能,增强安全性。环境准备
1. 安装依赖
pip install flask flask-sqlalchemy flask-wtf pymysql mysqlclient
注意:如果你使用的是 Windows 系统,可能需要安装
mysqlclient
的预编译版本,推荐使用 Unofficial Windows Binaries for Python Extension Packages 来下载对应版本。
2. 创建项目目录结构
flask-mysql-app/│├── app.py├── config.py├── requirements.txt├── templates/│ ├── index.html│ ├── login.html│ └── register.html└── instance/ └── site.db
配置数据库连接
创建 config.py
文件,定义数据库 URI:
import osclass Config: SECRET_KEY = os.environ.get('SECRET_KEY') or 'your-secret-key' SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://username:password@localhost/flask_users' SQLALCHEMY_TRACK_MODIFICATIONS = False
替换
username
和password
为你本地 MySQL 的用户名和密码。确保你已经创建了名为flask_users
的数据库。
编写主程序
1. 初始化 Flask 应用
编辑 app.py
:
from flask import Flask, render_template, redirect, url_for, request, flashfrom flask_sqlalchemy import SQLAlchemyfrom flask_wtf.csrf import CSRFProtectfrom werkzeug.security import generate_password_hash, check_password_hashfrom forms import RegistrationForm, LoginFormapp = Flask(__name__)app.config.from_object('config.Config')db = SQLAlchemy(app)csrf = CSRFProtect(app)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)) def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password)@app.route('/')def index(): users = User.query.all() return render_template('index.html', users=users)@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) user.set_password(form.password.data) db.session.add(user) db.session.commit() flash('注册成功!') return redirect(url_for('index')) 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.check_password(form.password.data): flash('登录成功!') return redirect(url_for('index')) else: flash('邮箱或密码错误!') return render_template('login.html', form=form)if __name__ == '__main__': with app.app_context(): db.create_all() app.run(debug=True)
2. 表单类定义
新建 forms.py
:
from flask_wtf import FlaskFormfrom wtforms import StringField, PasswordField, SubmitFieldfrom wtforms.validators import DataRequired, Email, EqualTo, Lengthclass RegistrationForm(FlaskForm): username = StringField('用户名', validators=[DataRequired(), Length(min=4, max=25)]) email = StringField('邮箱', validators=[DataRequired(), Email()]) password = PasswordField('密码', validators=[DataRequired(), Length(min=6)]) confirm = PasswordField('确认密码', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('注册')class LoginForm(FlaskForm): email = StringField('邮箱', validators=[DataRequired(), Email()]) password = PasswordField('密码', validators=[DataRequired()]) submit = SubmitField('登录')
前端页面设计
我们使用 Jinja2 模板引擎来渲染 HTML 页面。下面展示三个主要页面的示例。
1. templates/index.html
<!DOCTYPE html><html><head> <title>用户列表</title></head><body> <h1>欢迎来到用户中心</h1> {% with messages = get_flashed_messages() %} {% if messages %} {% for message in messages %} <div>{{ message }}</div> {% endfor %} {% endif %} {% endwith %} <a href="{{ url_for('register') }}">注册</a> | <a href="{{ url_for('login') }}">登录</a> <h3>用户列表</h3> <ul> {% for user in users %} <li>{{ user.username }} - {{ user.email }}</li> {% endfor %} </ul></body></html>
2. templates/register.html
<!DOCTYPE html><html><head> <title>注册</title></head><body> <h1>注册</h1> <form method="POST"> {{ form.hidden_tag() }} {{ form.username.label }} {{ form.username }} {{ form.email.label }} {{ form.email }} {{ form.password.label }} {{ form.password }} {{ form.confirm.label }} {{ form.confirm }} {{ form.submit }} </form></body></html>
3. templates/login.html
<!DOCTYPE html><html><head> <title>登录</title></head><body> <h1>登录</h1> <form method="POST"> {{ form.hidden_tag() }} {{ form.email.label }} {{ form.email }} {{ form.password.label }} {{ form.password }} {{ form.submit }} </form></body></html>
运行与测试
启动 Flask 应用:python app.py
注册新用户并查看是否能正确保存到数据库。
登录后会显示欢迎信息。
查看用户列表是否正确显示。
总结
本文详细介绍了如何使用 Flask 搭建一个具备基本功能的 Web 应用,并结合 MySQL 进行用户数据管理。我们实现了用户注册、登录以及数据展示的基本流程,并展示了前后端交互的关键技术点。
虽然这是一个基础的示例,但它涵盖了 Web 开发中的多个核心概念:
路由定义表单验证数据持久化模板渲染用户认证你可以在此基础上继续扩展,例如添加用户权限控制、分页显示、RESTful API 接口等功能,进一步提升系统的完整性和实用性。
参考文献:
Flask 官方文档Flask-SQLAlchemy 文档WTForms 官方文档