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
练习顺序
按照以下顺序逐步学习和理解代码:
-
先看入口文件 : app.py
- 了解Flask应用的初始化
- 蓝图的注册方式
- 主路由的定义
-
了解配置文件 : config.py
- 学习不同环境的配置方式
-
学习工具函数 : utils/decorators.py
- 理解自定义装饰器的实现
-
学习蓝图模块 :按以下顺序
- blueprints/user/ :基础的用户模块
- init.py :蓝图的创建
- views.py :函数视图和类视图的实现
- blueprints/product/ :产品模块
- 学习类视图的继承关系
- blueprints/admin/ :管理模块
- 学习子域名的配置
- 学习装饰器的组合使用
- blueprints/user/ :基础的用户模块
-
查看模板文件 :
- 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
可自行下载