Python3+Flask授权门户:如何重定向至用户授权前请求的页面
Flask授权后重定向至原请求页面的实现方案
1. 拦截未授权请求时保存原页面URL
在用户未登录/未授权时,把他原本要访问的页面URL存储到session中,后续授权完成后读取这个值进行重定向。可以通过自定义装饰器或者before_request钩子实现:
方式一:自定义登录验证装饰器
from functools import wraps from flask import session, redirect, url_for, request def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'user_id' not in session: # 替换为你的授权判断逻辑 # 排除登录/授权自身路由,仅保存GET请求的完整URL if request.endpoint != 'auth.login' and request.method == 'GET': session['next_url'] = request.full_path return redirect(url_for('auth.login')) return f(*args, **kwargs) return decorated_function
给需要授权的路由添加该装饰器:
@app.route('/dashboard') @login_required def dashboard(): return '用户仪表盘页面'
方式二:全局拦截钩子(before_request)
如果需要全局拦截未授权请求,可使用before_request:
@app.before_request def check_auth(): # 排除无需授权的路由(登录、静态文件等) exempt_routes = ['auth.login', 'static'] if request.endpoint not in exempt_routes and 'user_id' not in session: if request.method == 'GET': session['next_url'] = request.full_path return redirect(url_for('auth.login'))
2. 授权完成后重定向至原页面
在登录/授权成功的视图函数中,读取session里保存的next_url,优先跳转至该地址,无值时使用默认页面:
@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': # 执行授权验证逻辑(示例:验证用户名密码) username = request.form['username'] password = request.form['password'] if validate_user(username, password): # 自定义验证函数 session['user_id'] = username # 保存用户标识到session # 取出原URL,默认重定向首页 next_url = session.pop('next_url', '/') return redirect(next_url) else: return '用户名或密码错误' return '登录页面'
3. 关键注意事项
- 必须配置Flask的
SECRET_KEY,否则session无法正常工作:app.config['SECRET_KEY'] = 'your-secure-secret-key-here' - 仅处理GET请求的跳转:POST请求的参数难以直接保存重定向,一般场景下只需处理GET请求;若需支持POST,需额外用临时存储(如数据库、缓存)保存请求数据,授权后重新提交,实现复杂度较高。
- 避免循环重定向:务必排除登录/授权相关路由,防止未授权时反复跳转至登录页又被拦截。
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

