Flask视图练习

Flask视图练习:

Flask视图练习

项目结构

Flask视图/
├── app.py                  # 应用入口
├── config.py               # 配置文件
├── utils/                  # 工具函数
│   ├── __init__.py
│   └── decorators.py       # 自定义装饰器
├── blueprints/             # 蓝图模块
│   ├── __init__.py
│   ├── user/               # 用户模块
│   │   ├── __init__.py     # 蓝图定义
│   │   └── views.py        # 视图函数
│   ├── product/            # 产品模块
│   │   ├── __init__.py     # 蓝图定义
│   │   └── views.py        # 视图函数
│   └── admin/              # 管理模块
│       ├── __init__.py     # 蓝图定义(含子域名)
│       └── views.py        # 视图函数
└── templates/              # 模板文件
    ├── index.html          # 主页
    ├── user/               # 用户模板
    │   ├── index.html
    │   ├── login.html
    │   ├── register.html
    │   ├── profile.html
    │   └── list.html
    ├── product/            # 产品模板
    │   ├── list.html
    │   └── detail.html
    └── admin/              # 管理模板
        ├── index.html
        ├── dashboard.html
        ├── users.html
        └── products.html

练习顺序

按照以下顺序逐步学习和理解代码:

  1. 先看入口文件 : app.py

    • 了解Flask应用的初始化
    • 蓝图的注册方式
    • 主路由的定义
  2. 了解配置文件 : config.py

    • 学习不同环境的配置方式
  3. 学习工具函数 : utils/decorators.py

    • 理解自定义装饰器的实现
  4. 学习蓝图模块 :按以下顺序

    • blueprints/user/ :基础的用户模块
      • init.py :蓝图的创建
      • views.py :函数视图和类视图的实现
    • blueprints/product/ :产品模块
      • 学习类视图的继承关系
    • blueprints/admin/ :管理模块
      • 学习子域名的配置
      • 学习装饰器的组合使用
  5. 查看模板文件 :

    • templates/index.html :主页模板
    • 各模块的模板文件
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

代码实现

1.app.py:主应用

from flask import Flask, render_template
from blueprints.user import user_bp
from blueprints.product import product_bp
from blueprints.admin import admin_bp
import os
from config import config, DevelopmentConfig  # 导入配置模块

app = Flask(__name__)
app.config.from_object(DevelopmentConfig)  # 从开发环境配置加载配置
app.secret_key = os.urandom(16)  # 设置一个安全的密钥

# 配置子域名支持,这个网上自行查找方法
# app.config['SERVER_NAME'] = 'example.com:5000'

# 注册蓝图
app.register_blueprint(user_bp, url_prefix='/user')
app.register_blueprint(product_bp, url_prefix='/product')
app.register_blueprint(admin_bp, url_prefix='/admin')

# 主页路由
@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.run()

2.config.py: 配置文件

class Config:
    """基本配置类,提供所有环境的默认配置"""
    SECRET_KEY = 'your-secret-key-here'  # 用于保护应用免受CSRF攻击的密钥
    DEBUG = False  # 调试模式,默认关闭
    TESTING = False  # 测试模式,默认关闭

class DevelopmentConfig(Config):
    """开发环境配置类,继承自基本配置类"""
    DEBUG = True  # 开启调试模式,提供详细的错误信息和调试工具
    SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db'  # 配置开发环境数据库URI
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 关闭SQLAlchemy修改跟踪

class TestingConfig(Config):
    """测试环境配置类,继承自基本配置类"""
    TESTING = True  # 开启测试模式,某些扩展会改变行为以适应测试需求
    SQLALCHEMY_DATABASE_URI = 'sqlite:///test.db'  # 配置测试环境数据库URI
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 关闭SQLAlchemy修改跟踪

class ProductionConfig(Config):
    """生产环境配置类,继承自基本配置类"""
    SQLALCHEMY_DATABASE_URI = 'sqlite:///prod.db'  # 配置生产环境数据库URI
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 关闭SQLAlchemy修改跟踪

# 配置字典,用于根据环境名称获取对应的配置类
config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig  # 默认使用开发环境配置
}

3.utils:工具函数

init.py: init.py 是空的,它的存在告诉 Python 这个目录是一个包。

在 Python 中,init.py 文件的存在是为了让解释器知道该目录应该被视为一个 Python 包(package)。包是一种组织模块的方式,它允许你通过目录结构来组织代码,并使用点语法(如 utils.decorators)来导入子模块或子包。

decorators.py: 自定义装饰器
from functools import wraps
from flask import request, redirect, url_for, flash, session, abort


def login_required(func):
    """
    登录验证装饰器:
    用于确保用户在访问某些视图函数之前已经登录。
    如果用户未登录,会重定向到登录页面,并显示警告消息。
    """
    @wraps(func)  # 保留原函数的名称和文档字符串
    def decorated_function(*args, **kwargs):
        # 检查会话中是否存在'user_id'键,表示用户是否已登录
        if 'user_id' not in session:
            # 如果用户未登录,显示警告消息
            flash('请先登录', 'warning')
            # 重定向到登录页面,并将当前请求的URL作为'next'参数传递
            return redirect(url_for('user.login', next=request.url))
        # 如果用户已登录,继续执行原函数
        return func(*args, **kwargs)
    return decorated_function


def admin_required(func):
    """
    管理员权限验证装饰器:
    用于确保只有管理员用户才能访问某些视图函数。
    如果用户未登录,会重定向到登录页面。
    如果用户已登录但不是管理员,会显示权限不足的错误消息并返回403状态码。
    """
    @wraps(func)  # 保留原函数的名称和文档字符串
    def decorated_function(*args, **kwargs):
        # 检查会话中是否存在'user_id'键,表示用户是否已登录
        if 'user_id' not in session:
            # 如果用户未登录,显示警告消息
            flash('请先登录', 'warning')
            # 重定向到登录页面,并将当前请求的URL作为'next'参数传递
            return redirect(url_for('user.login', next=request.url))
        # 检查会话中的'user_role'是否为管理员
        if session.get('role') != 'admin':
            # 如果不是管理员,显示错误消息并返回403状态码
            flash('权限不足', 'danger')
            abort(403)
        # 如果是管理员,继续执行原函数
        return func(*args, **kwargs)
    return decorated_function


def api_required(func):
    """
    API接口验证装饰器:
    用于验证请求中是否包含有效的API密钥。
    如果API密钥无效或缺失,返回包含错误信息的JSON响应和401状态码。
    """
    @wraps(func)  # 保留原函数的名称和文档字符串
    def decorated_function(*args, **kwargs):
        # 从请求头中获取'X-API-Key'值
        api_key = request.headers.get('X-API-Key')
        # 验证API密钥是否匹配预设值(此处为示例值,实际应用中应使用更安全的存储方式)
        if not api_key or api_key != 'your-api-key-here':
            # 如果API密钥无效或缺失,返回错误响应
            return {'error': 'Invalid API Key'}, 401
        # 如果API密钥有效,继续执行原函数
        return func(*args, **kwargs)
    return decorated_function

剩余模块

由于代码量多,所以剩下的模块代码:链接 提取码: 2gq2
可自行下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值