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.id
        return 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 = None
    if 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 使用应用。

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

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

相关推荐
傻啦嘿哟7 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670797 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
2601_962077607 小时前
python Dejavu库快速识别音频指纹实例探究
python·音乐识别·dejavu库·音频指纹识别·实例探究
科技苑7 小时前
如何用Python编程实现一个简单的Web爬虫?
人工智能·python
dayDayupbetter8 小时前
Visual C++ 2010安装与使用高手秘籍
python
隐擎fox8 小时前
深入理解网络传输层安全:TLS 指纹识别(JA3/JA4)原理与 Python 协议层检测实战
爬虫·python·网络协议·安全·网络安全·https
医疗信息化王工8 小时前
DataForge:基于 Python 的数据库批量导出 Excel 工具——从架构到部署的全流程实战
数据库·python·excel
小玮看世界9 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
Java陈序员9 小时前
轻量运维面板!一款现代化的服务器控制面板工具!
运维·服务器·python·react.js·github
2601_962097369 小时前
1. 使用 C 或 C++ 扩展 Python
python·api·c·引用计数·扩展模块