Flask入门:打造简易投票系统

ops/2024/12/19 18:59:04/

目录

准备工作

创建项目结构

编写HTML模板

编写Flask应用

代码解读

进一步优化

结语


Flask,这个轻量级的Python Web框架,因其简洁和易用性,成为很多开发者入门Web开发的首选。今天,我们就用Flask来做一个简单的投票系统,让你快速上手Web开发,同时理解Flask的核心概念。

准备工作

在开始之前,你需要确保已经安装了Python和pip。然后,你可以通过pip安装Flask:

pip install Flask

创建项目结构

为了保持项目的整洁和可维护性,我们先创建一个基本的项目结构:

/voting_app/templatesindex.htmlapp.py

templates文件夹用于存放HTML模板。
app.py是我们的Flask应用代码。

编写HTML模板

首先,我们来编写一个简单的HTML模板,用于展示投票页面和结果。在templates文件夹中创建index.html文件,并添加以下代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>投票系统</title>
</head>
<body><h1>投票系统</h1><form action="/vote" method="post"><input type="radio" name="choice" value="猫"> 猫<br><input type="radio" name="choice" value="狗"> 狗<br><input type="radio" name="choice" value="兔子"> 兔子<br><input type="submit" value="投票"></form>{% if votes %}<h2>投票结果</h2><ul>{% for choice, count in votes.items() %}<li>{{ choice }}: {{ count }}</li>{% endfor %}</ul>{% endif %}
</body>
</html>

这个模板包含一个简单的表单,用于选择投票选项,并显示投票结果。

编写Flask应用

接下来,我们在app.py中编写Flask应用代码:

python">from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)# 存储投票结果的字典
votes = {'猫': 0,'狗': 0,'兔子': 0
}@app.route('/')
def index():"""显示投票页面和结果"""return render_template('index.html', votes=votes)@app.route('/vote', methods=['POST'])
def vote():"""处理投票请求"""choice = request.form.get('choice')if choice in votes:votes[choice] += 1return redirect(url_for('index'))if __name__ == '__main__':app.run(debug=True)

代码解读

导入Flask和其他模块:

from flask import Flask, request, render_template, redirect, url_for

我们导入了Flask框架中需要用到的模块,包括Flask类本身、处理请求的request模块、渲染模板的render_template函数、重定向的redirect函数和生成URL的url_for函数。

创建Flask应用实例:

app = Flask(__name__)

这里我们创建了一个Flask应用实例,并传入__name__变量作为参数。这个变量表示当前模块的名称,Flask使用它来定位模板和静态文件的目录。

定义全局变量:

python">votes = {'猫': 0,'狗': 0,'兔子': 0
}

我们定义了一个全局字典votes,用于存储每个选项的投票数。

定义路由和视图函数:

python">@app.route('/')
def index():"""显示投票页面和结果"""return render_template('index.html', votes=votes)

这里我们定义了一个路由/,当用户访问这个URL时,会调用index视图函数。这个函数使用render_template函数渲染index.html模板,并将votes字典传递给模板。

python">@app.route('/vote', methods=['POST'])
def vote():"""处理投票请求"""choice = request.form.get('choice')if choice in votes:votes[choice] += 1return redirect(url_for('index'))

这里我们定义了另一个路由/vote,并指定它只接受POST请求。当用户提交投票表单时,会调用vote视图函数。这个函数从request.form中获取用户选择的选项,并更新votes字典中的投票数。然后,使用redirect函数重定向到index视图函数,显示更新后的投票结果。

运行Flask应用:

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

最后,我们检查当前脚本是否是主脚本(即直接运行而不是被导入到其他脚本中)。如果是主脚本,则调用app.run()方法来启动Flask应用。debug=True参数表示开启调试模式,这样我们可以实时看到代码修改后的效果,并且当代码出现错误时,会显示详细的错误信息。

运行应用

现在,你可以在终端中运行app.py文件来启动Flask应用:

python app.py

然后,在浏览器中打开http://127.0.0.1:5000/,你将看到投票系统的页面。选择一个选项并提交表单,你将看到投票结果实时更新。

进一步优化

虽然这个简单的投票系统已经可以正常工作了,但我们还可以对它进行一些优化,使其更加健壮和可扩展。

持久化存储:

目前,投票结果是存储在全局变量votes中的,这意味着当应用重启时,投票结果会丢失。为了解决这个问题,我们可以将投票结果存储到数据库或文件中。

表单验证:

在vote视图函数中,我们直接从request.form中获取用户选择的选项,并没有进行任何验证。在实际应用中,我们应该对用户输入进行验证,以确保数据的合法性和安全性。

错误处理:

目前,当遇到错误时(如数据库连接失败、文件读写错误等),应用可能会崩溃或显示不友好的错误信息。为了提升用户体验和应用的稳定性,我们应该添加适当的错误处理机制。

模板优化:

目前的HTML模板比较简单,只包含基本的投票功能和结果显示。在实际应用中,我们可以使用CSS和JavaScript来美化页面和增强交互性。

用户认证:

为了防止恶意投票(如重复投票、刷票等),我们可以添加用户认证机制。只有经过认证的用户才能参与投票。

部署到生产环境:

当应用开发完成后,我们需要将其部署到生产环境中。这通常涉及到配置Web服务器(如Gunicorn、uWSGI等)、数据库服务器(如MySQL、PostgreSQL等)和反向代理(如Nginx、Apache等)。同时,我们还需要考虑应用的性能优化、安全性(如HTTPS、防火墙等)和可维护性(如日志记录、监控等)。

结语

通过这个简单的投票系统示例,我们了解了Flask框架的基本概念和用法。Flask的简洁和易用性使得它成为入门Web开发的理想选择。当然,Web开发是一个复杂而广阔的领域,涉及到前端、后端、数据库、安全性等多个方面。希望这个示例能够激发你对Web开发的兴趣,并为你后续的学习和实践打下坚实的基础。


http://www.ppmy.cn/ops/143261.html

相关文章

监控易监测对象及指标之:宝兰德中间件JMX监控指标解读

监控易作为一款全面的IT监控软件&#xff0c;能够为企业提供深入、细致的监控服务&#xff0c;确保企业IT系统的稳定运行。在本文中&#xff0c;我们将详细解读监控易针对宝兰德中间件JMX的监控指标&#xff0c;以帮助用户更好地理解和应用这些监控数据。 监测指标概览&#x…

Java Stream 流的使用

Java Stream 流的使用 在实际生产中&#xff0c;几乎很少使用for循环的结构进行操作&#xff0c;Java 8 提供的Stream可以大大提高程序员的生产力&#xff0c;由于自己之前对于Stream 流使用的并不是很熟练&#xff0c;所以在这里进行简单的总结归纳。 最后熟练的使用Stream流&…

IO的进阶

目录 1. 字符流转向字节流的桥梁1.1 OutputStreamWriter1.2 InputStreamReader1.3 编码与解码1.4 常见编码方式1.5 编码与解码的注意事项 2.Properties2.1概述2.2 Properties 的常用方法2.3 Properties 的应用场景2.4 实例 3.序列化3.1 ObjectOutputStream 4.字符编码4.1 ASCII…

《网络对抗技术》Exp9 Web安全基础

实验目标 理解常用网络攻击技术的基本原理。 实验内容 Webgoat实践下相关实验。 实验环境 macOS下Parallels Desktop虚拟机中&#xff08;网络源均设置为共享网络模式&#xff09;&#xff1a; Kali Linux - 64bit&#xff08;攻击机&#xff0c;IP为10.211.55.10&#xff09;…

C++ OCR证件照文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

科研绘图系列:R语言绘制韦恩图(Venn plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据处理画图系统信息介绍 R语言绘制韦恩图(Venn plot) 加载R包 library(tidyverse) library(ggplot2) library(ggrepel) library(dplyr) library(rea…

docker安装mysql5.7

1、宿主机创建映射目录 mkdir -p /data/mysql/log mkdir -p /data/mysql/data mkdir -p /data/mysql/conf这里我放在了/data/mysql目录下 2、拉取mysql镜像 docker pull mysql:5.7注意是5.7版本&#xff0c;如果是8版本操作会略有不同&#xff0c;下篇文章介绍安装8版本的操…

HTTP 协议

文章目录 1. 预备知识1.1 域名1.2 url 2. http请求和响应的格式2.1 http request2.2 http response2.3 使用telnet看一下http response2.4 使用fiddler来进行抓包&#xff0c;看一下http request 3. 写一个简单的httpserver3.1 基础框架3.2 web根目录3.3 拿到url&#xff0c;更…