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 应用开发。

相关推荐
Gu Gu Study26 分钟前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境1 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境1 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1231 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102162 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb002 小时前
一个项目带你入门AI应用开发01
python
0566463 小时前
Python康复训练——常用标准库
开发语言·python·学习
昆曲之源_娄江河畔3 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql
0566463 小时前
Python康复训练——控制流与函数
开发语言·python·学习
天使day4 小时前
FastAPI快速入门
python·fastapi