回答于 2025-05-17
markdown
Python 中间件实现页面按钮权限控制方案
一、实现思路
通过中间件拦截请求,结合会话机制实现以下功能:
- 已登录用户隐藏注册/登录按钮
- 未登录用户展示注册/登录按钮
- 根据用户状态自动跳转对应页面
二、具体实现(以Flask为例)
1. 创建中间件类
python class AuthMiddleware: def init(self, app): self.app = app self.excluded_paths = ['/register', '/login', '/static']
def __call__(self, environ, start_response):
path = environ.get('PATH_INFO', '')
# 跳过静态资源和认证相关路由
if any(path.startswith(p) for p in self.excluded_paths):
return self.app(environ, start_response)
# 检查会话中的登录状态
with self.app.request_context(environ):
session = environ.get('beaker.session')
if not session.get('logged_in'):
# 未登录重定向到登录页
redirect_response = redirect('/login')
return redirect_response(environ, start_response)
return self.app(environ, start_response)
2. 初始化中间件
python from flask import Flask from beaker.middleware import SessionMiddleware
app = Flask(name) app.wsgi_app = AuthMiddleware(app.wsgi_app)
配置会话中间件
session_opts = { 'session.type': 'file', 'session.data_dir': './session', 'session.auto': True } app.wsgi_app = SessionMiddleware(app.wsgi_app, session_opts)
3. 模板控制逻辑(Jinja2示例)
html
三、关键配置说明
-
中间件拦截策略:
- 排除静态资源和认证相关路由
- 使用会话机制保持登录状态
- 自动重定向未授权请求
-
会话管理:
- 使用Beaker会话中间件
- 文件存储式会话(生产环境建议使用Redis)
- 自动维护会话有效期
-
前端集成:
- 通过模板变量控制元素显示
- 动态切换导航栏状态
- 支持多角色扩展(可添加
user.role判断)
四、扩展建议
- 添加CSRF保护中间件
- 实现基于角色的访问控制(RBAC)
- 集成JWT认证支持API访问
- 添加访问频率限制中间件
- 实现审计日志记录功能
注意:Django框架可使用
process_request中间件实现类似功能,核心逻辑与Flask方案一致,主要差异在框架特定API的使用上。