flask功能使用总结和完整示例

Flask 功能使用总结与完整示例

一、Flask 核心功能总结

Flask 是轻量级 Web 框架,核心功能包括:

  • 路由系统:通过  @app.route  装饰器定义 URL 与函数的映射。
  • 模板引擎:默认使用 Jinja2,支持动态渲染 HTML。
  • 请求处理:获取请求参数、表单数据、文件上传等。
  • 响应处理:返回 JSON、HTML、重定向等。
  • 会话管理:通过  session  对象存储用户状态。
  • 扩展支持:可集成 Flask-SQLAlchemy(数据库)、Flask-RESTful(API)等扩展。

二、完整示例:简易待办事项应用

以下是一个包含用户认证、待办事项管理的 Flask 应用示例:

from flask import Flask, render_template, request, redirect, url_for, session, jsonify
from flask_sqlalchemy import SQLAlchemy
import datetime
import uuid

初始化应用

app = Flask(name)
app.secret_key = ‘your_secret_key’ # 用于会话加密
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///todo_app.db’
db = SQLAlchemy(app)

数据库模型

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(120), nullable=False)
todos = db.relationship(‘Todo’, backref=‘user’, lazy=True)

class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text)
due_date = db.Column(db.DateTime)
completed = db.Column(db.Boolean, default=False)
user_id = db.Column(db.Integer, db.ForeignKey(‘user.id’), nullable=False)

创建数据库表

with app.app_context():
db.create_all()

路由:首页 - 重定向到登录页

@app.route(’/’)
def index():
if ‘user_id’ in session:
return redirect(url_for(‘todo_list’))
return redirect(url_for(‘login’))

路由:登录页

@app.route(’/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
username = request.form.get(‘username’)
password = request.form.get(‘password’)

    user = User.query.filter_by(username=username).first()if user and user.password == password:  # 实际应用中应使用密码哈希session['user_id'] = user.idreturn redirect(url_for('todo_list'))return render_template('login.html', error='用户名或密码错误')
return render_template('login.html')

路由:注册页

@app.route(’/register’, methods=[‘GET’, ‘POST’])
def register():
if request.method == ‘POST’:
username = request.form.get(‘username’)
password = request.form.get(‘password’)

    # 检查用户是否存在if User.query.filter_by(username=username).first():return render_template('register.html', error='用户名已存在')# 创建新用户new_user = User(username=username, password=password)db.session.add(new_user)db.session.commit()return redirect(url_for('login'))
return render_template('register.html')

路由:待办事项列表

@app.route(’/todos’)
def todo_list():
if ‘user_id’ not in session:
return redirect(url_for(‘login’))

user = User.query.get(session['user_id'])
todos = Todo.query.filter_by(user_id=session['user_id']).all()
return render_template('todo_list.html', user=user, todos=todos)

路由:添加待办事项

@app.route(’/todos/add’, methods=[‘GET’, ‘POST’])
def add_todo():
if ‘user_id’ not in session:
return redirect(url_for(‘login’))

if request.method == 'POST':title = request.form.get('title')description = request.form.get('description')due_date_str = request.form.get('due_date')due_date = Noneif due_date_str:due_date = datetime.datetime.strptime(due_date_str, '%Y-%m-%d')new_todo = Todo(title=title,description=description,due_date=due_date,user_id=session['user_id'])db.session.add(new_todo)db.session.commit()return redirect(url_for('todo_list'))return render_template('add_todo.html')

路由:更新待办事项状态

@app.route(’/todos/int:todo_id/toggle’, methods=[‘POST’])
def toggle_todo(todo_id):
if ‘user_id’ not in session:
return jsonify({‘status’: ‘error’, ‘message’: ‘未登录’})

todo = Todo.query.filter_by(id=todo_id, user_id=session['user_id']).first()
if not todo:return jsonify({'status': 'error', 'message': '待办事项不存在'})todo.completed = not todo.completed
db.session.commit()
return jsonify({'status': 'success', 'completed': todo.completed})

路由:登出

@app.route(’/logout’)
def logout():
session.clear()
return redirect(url_for(‘login’))

启动应用

if name == ‘main’:
app.run(debug=True)

三、模板文件示例

假设模板文件存放在  templates  目录下:

  1. login.html
登录 - 待办事项应用

登录

{% if error %}
{{ error }}
{% endif %}

登录 注册新账户  
  1. todo_list.html
待办事项 - {​{ user.username }}

我的待办事项

添加待办 登出
<ul>{% for todo in todos %}<li><input type="checkbox" onchange="toggleTodo({{ todo.id }})" {% if todo.completed %}checked{% endif %}><span style="text-decoration: {% if todo.completed %}line-through{% endif %}">{{ todo.title }}</span>{% if todo.due_date %}<span style="color: {% if todo.due_date < now and not todo.completed %}red{% else %}green{% endif %}">(截止: {{ todo.due_date.strftime('%Y-%m-%d') }})</span>{% endif %}</li>{% else %}<li>暂无待办事项,点击"添加待办"创建</li>{% endfor %}
</ul><script>function toggleTodo(todoId) {fetch(`/todos/${todoId}/toggle`, {method: 'POST'}).then(response => response.json()).then(data => {if (data.status !== 'success') {alert(data.message);}});}
</script>
 

四、功能说明

1. 用户认证:

  • 注册新用户并存储到数据库。
  • 登录后通过会话(session)保持用户状态。
    2. 待办事项管理:
  • 列表展示:显示所有待办事项及完成状态。
  • 添加功能:支持标题、描述、截止日期。
  • 状态更新:通过 AJAX 异步切换完成状态。
    3. 技术要点:
  • 路由设计:RESTful 风格 URL。
  • 数据库操作:使用 SQLAlchemy ORM。
  • 模板渲染:Jinja2 动态生成 HTML。
  • 会话管理:Flask 内置 session 对象。

五、运行与扩展

1. 运行方式:
pip install flask flask-sqlalchemy
python app.py

访问  http://127.0.0.1:5000  使用应用。
2. 扩展方向:

  • 添加密码哈希(如 bcrypt)增强安全性。
  • 集成 Flask-RESTful 提供 API 接口。
  • 使用 Flask-Migrate 管理数据库迁移。
  • 添加文件上传、用户头像等功能。

通过以上示例,可快速掌握 Flask 的核心功能和项目结构,适用于中小型 Web 应用开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS应用基础阶段- 09、综合案例-仿携程旅行口碑榜

文章目录 携程-口碑榜1、banner 区域1.1 区域部分1.2 口碑榜 Logo1.3 推荐榜单1.4 评分规则1.5 底部 Line 2、选择城市和目的地2.1 区域布局2.2 选择城市2.3 口碑目的地 3、商业选项菜单4、热门项目选项4.1 区域布局4.2 热门标题4.3 选项 5、热门榜标题6、热门景点列表6.1 区域…

中小制造企业转型:低成本国产工业软件替代方案实践

在数字经济浪潮席卷全球的当下&#xff0c;制造业数字化转型已成为企业提升竞争力、实现可持续发展的必由之路。然而&#xff0c;高昂的成本与复杂的技术门槛&#xff0c;却让众多中小制造企业陷入 “不能转、不想转、不会转、不敢转” 的困局。幸运的是&#xff0c;一批具有自…

Kafka 核心架构与消息模型深度解析(二)

案例实战&#xff1a;Kafka 在实际场景中的应用 &#xff08;一&#xff09;案例背景与需求介绍 假设我们正在为一个大型电商平台构建数据处理系统。该电商平台拥有庞大的用户群体&#xff0c;每天会产生海量的订单数据、用户行为数据&#xff08;如浏览、点击、收藏等&#…

【iOS】cache_t分析

前言 之前分析类的结构的时候&#xff0c;有遇到一个cache_t&#xff0c;当时说是用来保存方法缓存的结构&#xff0c;这篇文章来从源码详细介绍一下cache_t 概览cache_t cache_t结构 类在底层的结构如之前所述&#xff0c;存在着cache_t属性&#xff0c;而cache_t的结构如下…

java面试题:List如何排序?内存溢出/OOM怎么回事?如何排查和解决?

List如何排序 List排序可以通过实现Comparable接口并且实现compareTo方法&#xff0c;或者传入comparator去实现排序。 内存溢出/OOM是怎么回事&#xff1f; 内存溢出就是程序在运行的过程中&#xff0c;申请的内存超过了最大内存限制&#xff0c;导致JVM抛出OOM异常&#x…

Python cryptography【密码库】库功能与使用指南

边写代码零食不停口 盼盼麦香鸡味块 、卡乐比&#xff08;Calbee&#xff09;薯条三兄弟 独立小包、好时kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 边写代码边贴面膜 事业美丽两不误 DR. YS 野森博士【AOUFSE/澳芙雪特证】377专研美白淡斑面膜组合 优惠劵 别光顾写…

第二十四章 流程控制_ if分支

第二十四章 流程控制: if分支和输入 正如许多编程语言一样Shell也有自己的条件分支语句。有时需要根据情况进行相应的处理&#xff0c;因此可以通过条件分支语句实现&#xff0c;本章主要介绍的是if分支语句。 if语句 在Shell中if语句语法格式如下&#xff1a; if commands…

电脑网络重置,找不到原先自家的WIFI,手机还能正常连接并上网

问题排查&#xff1a;1、电脑感觉网络太慢&#xff0c;因此打算点击了网络重置 2、点击提示会删除网络&#xff0c;在五分钟后关机重启 3、从设备管理器设备的无线wifi属性-事件中发现删除记录 4、选择更新驱动程序 5、从列表中选取 6、更改回老驱动版本 备选方案&#…

C语言_预处理详解

1. 预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的 1 __FILE__ //进行编译的源文件 2 __LINE__//文件当前的行号 3 __DATE__ //文件被编译的日期 4 __TIME__//文件被编译的时间 5 __STDC__//如果编译器遵循ANSI…

【QT】使用QT帮助手册找控件样式

选择帮助—》输入stylesheet(小写)—》选择stylesheet—》右侧选择Qt Style Sheets Reference 2.使用CtrlF—》输入要搜索的控件—》点击Customizing QScrollBar 3.显示参考样式表–》即可放入QT-designer的样式表中

SQL知识合集(二):函数篇

TRIM函数 作用&#xff1a;去掉字符串前后的空格 SELECT * FROM your_table_name WHERE TRIM(column_name) ; COALESCE函数 作用&#xff1a;返回其参数中的第一个非 NULL 值。它可以接受多个参数&#xff0c;并从左到右依次评估这些参数&#xff0c;直到找到第一个非 NUL…

Cursor 工具项目构建指南: Uniapp Miniprogram 环境下的 Prompt Rules 约束

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南: Uniapp Miniprogram 环境下的 Prompt Rules 约束前言项目简…

Java转Go日记(六十):gin其他常用知识

1. 日志文件 package mainimport ("io""os""github.com/gin-gonic/gin" )func main() {gin.DisableConsoleColor()// Logging to a file.f, _ : os.Create("gin.log")gin.DefaultWriter io.MultiWriter(f)// 如果需要同时将日志写入…

cocos单例工厂和自动装配

cocos单例工厂和自动装配 1 单例工厂 1.1 分析 实例字典 原理很简单&#xff0c;只是一个map&#xff0c;确保每个类只保留一个实例&#xff1b; private static _instances new Map<string, any>();获取与存储实例 这边使用的方式是生成一个唯一的id存储在类上&…

django paramiko 跳转登录

在使用Django框架结合Paramiko进行SSH远程操作时&#xff0c;通常涉及到自动化脚本的执行&#xff0c;比如远程服务器上的命令执行、文件传输等。如果你的需求是“跳转登录”&#xff0c;即在登录远程服务器后&#xff0c;再通过该服务器的SSH连接跳转到另一台服务器&#xff0…

《C++初阶之类和对象》【命名空间 + 输入输出 + 缺省参数 + 函数重载】

【命名空间 输入&输出 缺省参数 函数重载】目录 前言&#xff1a;---------------hello world---------------比较C语言和C的第一个程序&#xff1a;hello word ---------------命名空间---------------什么是命名空间&#xff1f;怎么使用命名空间&#xff1f;怎么定义…

[USACO1.5] 八皇后 Checker Challenge Java

import java.util.*;public class Main {// 标记 对角线1&#xff0c;对角线2&#xff0c;所在x轴 是否存在棋子static boolean[] d1 new boolean[100], d2 new boolean[100], d new boolean[100]; static int n, ans 0;static int[] arr new int[14]; // 记录一轮棋子位置…

云服务器Xshell登录拒绝访问排查

根据你的描述&#xff0c;使用Xshell 8登录云服务器时显示“拒绝访问”&#xff0c;可能涉及多个原因。以下结合搜索结果整理出排查和解决方法&#xff0c;按优先级排序&#xff1a; 一、检查基础网络与端口连通性 本地网络与服务器IP是否可达 在本地电脑的CMD中执行 ping 服务…

Python爬虫实战:研究urlunparse函数相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上的数据量呈现出指数级增长。如何从海量的网页数据中高效地获取有价值的信息,成为了学术界和工业界共同关注的问题。网络爬虫作为一种自动获取网页内容的技术,能够按照预定的规则遍历互联网上的网页,并提取出所需…

Spring AI学习一

随着Chatpt的火爆&#xff0c;现在Spring官方也开始支持AI了并推出了Spring AI框架&#xff0c;目前还没发布正式版本&#xff0c;这里可以先看一下官方依赖的版本。 Spring官网地址可以看这里&#xff1a;Spring | Home 目前官网上是有这两个版本&#xff1a;1.0.0和1.1.0-SN…