仓库:MuZiCul/Flask_framework(原创)· 语言:Python (Flask) + Layui 2.7.6 · 定位:前后端一体业务系统脚手架
这是作者多个 Flask 业务系统(
RFID_Flask、huatec、WZRYTYF)的源头框架,理解了它就理解了后续项目的骨架。
app.py)app.config.from_object(config)
app.config['SCHEDULER_TIMEZONE'] = 'Asia/Shanghai' # 定时任务时区(避免 UTC 差 8 小时)
db.init_app(app)
mail.init_app(app)
redis_client.init_app(app)
migrate = Migrate(app, db)
scheduler = APScheduler()
scheduler.init_app(app)
app.register_blueprint(user_bp)
app.register_blueprint(general_bp)
app.config['UPLOAD_PATH'] = os.path.join(os.path.dirname(__file__), 'file')
scheduler.start()
@scheduler.task('interval', id='clean', seconds=300)
def clean():
try:
with scheduler.app.app_context(): # 必须手动推入应用上下文
delCaptcha() # 清理过期验证码
PollingUserOnline() # 更新在线用户状态
finally:
pass
with scheduler.app.app_context() 是关键——APScheduler 的定时任务运行在独立线程中,不在 Flask 请求上下文里,直接操作数据库会报 "Working outside of application context"。这个模式在 RFID_Flask、WZRYTYF 中都被沿用。
@app.before_first_request
def before_first_request():
delCaptcha()
@app.before_request
def before_request():
user_id = session.get('userid')
g.DATABASE_DATA = 0
if user_id:
try:
user = UserModel.query.get(user_id)
g.user = user if user else ''
except Exception as e:
print('before_request', e)
g.user = ''
@app.context_processor
def context_processor():
if hasattr(g, 'user'):
return {'user': g.user}
return {}
before_first_request 首次请求前先清理一次验证码before_request 注入 g.user,异常时降级为空(不阻断请求)context_processor 把 user 注入所有模板| 能力 | 实现 |
|---|---|
| 双登录方式 | 密码登录 + 邮箱验证码无密码登录 |
| 角色体系 | 管理员 / 普通员工 |
| 无密码登录开关 | 管理员可配置是否启用 |
| 验证码存储 | Redis |
| 定时任务 | 验证码清理 + 在线用户轮询 |
| 邮件发送 | Flask-Mail |
| 图形验证码 | utils/captchas.py(PIL 生成) |
| 文件上传 | UPLOAD_PATH = <项目根>/file |
默认测试账号:test / test
Flask_framework/
├── app.py # 入口(含调度任务与请求钩子)
├── blueprints/
│ ├── user_bp # 用户(登录/注册/个人中心)
│ └── general_bp # 通用页面
├── config/
│ ├── config.py # 配置(DB/Redis/Mail)
│ ├── models.py # 数据模型
│ ├── exts.py # db/mail/redis_client 扩展
│ └── decorators.py # login_required 等
├── utils/
│ ├── captchas.py # 图形验证码
│ └── useronline.py # 在线用户统计
├── templates/ static/ file/ migrations/
└── requirements.txt
Flask、Flask-SQLAlchemy、Flask-Migrate、Flask-Mail、Flask-APScheduler、Flask-Redis、Pillow、pymysql
这个框架沉淀了作者在多个 Flask 项目中的通用能力:Redis 验证码、邮件发送、定时任务清理、在线用户统计、蓝图分层、装饰器权限。
几个值得借鉴的实践:
1. SCHEDULER_TIMEZONE = 'Asia/Shanghai' —— 不设时区的 APScheduler 会按 UTC 触发,定时任务平白差 8 小时,是经典坑
2. 定时任务手动推 app_context() —— 线程外操作数据库的必备写法
3. 请求钩子异常降级 —— except 里设 g.user = '' 而非抛出,保证请求继续
作为 Flask 业务系统脚手架,它提供了"登录 + 权限 + 验证码 + 邮件 + 定时任务"的完整地基,新项目直接在此基础上写业务即可。