首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Flask简介与安装
第一个Flask应用
Flask路由与视图函数
Flask模板引擎Jinja2
Flask模板继承与包含
Flask静态文件处理
Flask表单处理
Flask请求与响应
Flask配置与日志
Flask蓝图与模块化设计
Flask扩展插件介绍
Flask数据库操作(一):SQLAlchemy基础
Flask数据库操作(二):迁移与模型关系
Flask数据库操作(三):数据库迁移与版本控制
Flask会话管理
Flask中间件与钩子函数
Flask错误处理与测试
Flask性能优化(一):缓存策略
Flask性能优化(二):异步与后台任务
Flask部署与运维
Flask源码解析(一):Werkzeug与Jinja2
Flask源码解析(二):路由系统
Flask源码解析(三):视图与请求处理
Flask源码解析(四):扩展插件机制
Flask安全性与防护策略
Flask国际化与本地化
Flask RESTful API开发(一):基础概念
Flask RESTful API开发(二):认证与权限控制
Flask RESTful API开发(三):版本控制与文档
Flask与前端框架集成(一):React
Flask与前端框架集成(二):Vue.js
Flask与前端框架集成(三):Angular
Flask微服务架构与实践(一):服务拆分与通信
Flask微服务架构与实践(二):容器化与编排
Flask微服务架构与实践(三):监控与故障排查
Flask性能监控与调优
Flask与其他Web框架对比分析
Flask插件开发与实践
Flask项目实战经验分享
Flask生态圈及发展趋势
实战项目一:搭建个人博客系统
实战项目二:开发在线投票系统
实战项目三:构建企业级后台管理系统
实战项目四:实现文件上传与下载功能
实战项目五:开发实时聊天室
实战项目六:构建RESTful API接口
实战项目七:实现用户权限管理系统
实战项目八:开发微信小程序后台
实战项目九:构建电商平台(一):商品管理
实战项目九:构建电商平台(二):购物车与订单
实战项目九:构建电商平台(三):支付与物流
实战项目十:搭建分布式爬虫系统
实战项目十一:实现数据可视化与分析
实战项目十二:开发在线教育平台(一):课程管理
实战项目十二:开发在线教育平台(二):视频点播
实战项目十二:开发在线教育平台(三):直播互动
实战项目十三:构建社交网络(一):用户关系
实战项目十三:构建社交网络(二):信息流与推荐
实战项目十三:构建社交网络(三):朋友圈与评论
实战项目总结与拓展
当前位置:
首页>>
技术小册>>
Flask框架入门指南
小册名称:Flask框架入门指南
### 实战项目二:开发在线投票系统 #### 引言 在Flask框架的学习旅程中,通过实际项目来巩固知识是不可或缺的一环。本章节将带领你构建一个完整的在线投票系统,该系统允许用户创建投票、参与投票并查看投票结果。通过这个项目,你将深入理解Flask的路由、模板渲染、表单处理、数据库操作(使用SQLite为例)、会话管理以及用户认证等核心概念。 #### 项目概述 在线投票系统主要由以下几个模块组成: 1. **用户管理**:支持用户注册、登录、登出及基本信息管理。 2. **投票管理**:管理员或特定用户能够创建新的投票,设定投票选项,并设置投票结束时间。 3. **投票参与**:注册用户可参与已发布的投票,为每个选项投票一次。 4. **结果展示**:展示每个投票的当前结果,包括每个选项的票数及投票者总数。 5. **投票结束处理**:投票结束后,系统自动锁定投票,防止进一步投票,并允许用户查看最终投票结果。 #### 环境准备 在开始编码之前,请确保你的开发环境已经安装了Python和Flask。此外,还需要安装Flask-SQLAlchemy(用于数据库操作)、Flask-Login(用于用户认证)和Flask-WTF(用于表单处理)等扩展库。可以通过pip安装这些库: ```bash pip install Flask Flask-SQLAlchemy Flask-Login Flask-WTF ``` #### 数据库设计 首先,设计数据库模型。我们需要至少三个表:`User`(用户)、`Vote`(投票)和`Choice`(投票选项)。 ```python from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin from datetime import datetime db = SQLAlchemy() class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) password_hash = db.Column(db.String(128), nullable=False) def __repr__(self): return f'<User {self.username}>' class Vote(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(255), nullable=False) start_time = db.Column(db.DateTime, default=datetime.utcnow) end_time = db.Column(db.DateTime, nullable=True) active = db.Column(db.Boolean, default=True) choices = db.relationship('Choice', backref='vote', lazy=True) def __repr__(self): return f'<Vote {self.title}>' class Choice(db.Model): id = db.Column(db.Integer, primary_key=True) vote_id = db.Column(db.Integer, db.ForeignKey('vote.id'), nullable=False) choice_text = db.Column(db.String(255), nullable=False) votes = db.Column(db.Integer, default=0) def __repr__(self): return f'<Choice {self.choice_text}>' ``` #### 用户认证与登录 使用Flask-Login来处理用户认证。首先,配置Flask-Login并创建用户加载器函数: ```python from flask_login import LoginManager, login_user, logout_user, login_required, current_user login_manager = LoginManager() login_manager.login_view = 'auth.login' login_manager.init_app(app) @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) # 示例登录函数 @app.route('/login', methods=['GET', 'POST']) def login(): # 省略表单处理和验证逻辑 user = User.query.filter_by(username=form.username.data).first() if user is None or not check_password_hash(user.password_hash, form.password.data): flash('Invalid username or password') return redirect(url_for('login')) login_user(user, remember=form.remember_me.data) return redirect(url_for('main.index')) ``` #### 投票系统核心功能实现 **创建投票**: - 管理员通过表单提交投票标题、选项及结束时间。 - 表单验证后,将数据存储至数据库。 ```python from flask import Blueprint, render_template, request, redirect, url_for, flash from .forms import VoteForm vote_bp = Blueprint('vote', __name__) @vote_bp.route('/create', methods=['GET', 'POST']) @login_required def create_vote(): form = VoteForm() if form.validate_on_submit(): vote = Vote(title=form.title.data, start_time=datetime.utcnow()) db.session.add(vote) db.session.commit() for choice in form.choices.data: new_choice = Choice(vote_id=vote.id, choice_text=choice) db.session.add(new_choice) db.session.commit() flash('Vote created successfully!') return redirect(url_for('vote.view_vote', vote_id=vote.id)) return render_template('create_vote.html', form=form) ``` **参与投票**: - 用户选择投票后,展示投票选项。 - 用户选择选项并提交,系统验证后更新数据库中的票数。 ```python @vote_bp.route('/<int:vote_id>/vote', methods=['GET', 'POST']) @login_required def vote_on_vote(vote_id): vote = Vote.query.get_or_404(vote_id) if not vote.active: flash('This vote is not active.') return redirect(url_for('vote.view_vote', vote_id=vote_id)) # 假设我们使用简单的单选逻辑 choice_id = request.form.get('choice') if choice_id: choice = Choice.query.get(choice_id) if choice and current_user.id not in [v.user_id for v in choice.votes]: choice.votes += 1 # 这里可以添加额外的逻辑来记录投票用户 db.session.commit() flash('Your vote has been cast!') else: flash('You have already voted for this option or you are not allowed to vote again.') return redirect(url_for('vote.view_vote', vote_id=vote_id)) # 省略view_vote等函数实现,以展示投票结果 ``` #### 安全性与错误处理 - 确保所有输入都经过适当的验证和清理,防止SQL注入等安全漏洞。 - 使用会话和CSRF保护来增强表单提交的安全性。 - 对于错误处理,使用Flask的`flash`消息和适当的HTTP状态码来通知用户操作结果。 #### 总结 通过开发这个在线投票系统,你不仅掌握了Flask框架的基本用法,还深入理解了Web应用开发中常见的模式和挑战,如用户认证、表单处理、数据库操作及安全性考虑。这个项目可以作为你进一步学习Flask和Web开发的坚实基础,激发你探索更多高级特性和最佳实践的兴趣。
上一篇:
实战项目一:搭建个人博客系统
下一篇:
实战项目三:构建企业级后台管理系统
该分类下的相关小册推荐:
Flask框架零基础入门与实战开发