markdown # Python 中间件实现页面按钮权限控制方案 ## 一、实现思路 通过中间件拦截请求,结合会话机制实现以下功能: 1. 已登录用户隐藏注册/登录按钮 2. 未登录用户展示注册/登录按钮 3. 根据用户状态自动跳转对应页面 ## 二、具体实现(以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
## 三、关键配置说明 1. **中间件拦截策略**: - 排除静态资源和认证相关路由 - 使用会话机制保持登录状态 - 自动重定向未授权请求 2. **会话管理**: - 使用Beaker会话中间件 - 文件存储式会话(生产环境建议使用Redis) - 自动维护会话有效期 3. **前端集成**: - 通过模板变量控制元素显示 - 动态切换导航栏状态 - 支持多角色扩展(可添加`user.role`判断) ## 四、扩展建议 1. 添加CSRF保护中间件 2. 实现基于角色的访问控制(RBAC) 3. 集成JWT认证支持API访问 4. 添加访问频率限制中间件 5. 实现审计日志记录功能 > 注意:Django框架可使用`process_request`中间件实现类似功能,核心逻辑与Flask方案一致,主要差异在框架特定API的使用上。