Flask实现登录后禁止用户访问登录页等站点页面的方案咨询
Flask登录后禁止访问公开页面的实现方案
你的需求完全可以实现,核心逻辑是对所有无需授权即可访问的路由(登录、注册等)增加登录状态判断,若用户已登录则直接重定向到登录后才能访问的内部页面,具体实现方案如下:
1. 快速修复现有路由校验逻辑
你当前/login路由中使用的redirect(request.referrer)存在隐患:如果用户直接在地址栏输入/login地址,请求来源request.referrer为空会触发报错,直接改为跳转到已登录用户的默认页即可,同时给注册路由/也加上相同的登录状态校验:
# 注册页(公开路由) @app.route('/',methods=['POST','GET']) def home(): # 新增:已登录用户直接跳转到内部页 if current_user.is_authenticated: return redirect(url_for('home1')) form = RegisterForm() try: if form.validate_on_submit(): user = users(name=form.name.data,password=generate_password_hash(form.password.data)) db.session.add(user) db.session.commit() return redirect('/login') except: return '用户名已存在' return render_template("register.html",form=form) # 登录页(公开路由) @app.route('/login',methods=['POST','GET']) def login(): form1 = LoginForm() # 修复:已登录用户直接跳转到内部页,不使用不可靠的referrer if current_user.is_authenticated: return redirect(url_for('home1')) if form1.validate_on_submit(): user1 = users.query.filter_by(name=form1.name.data).first() if user1: if check_password_hash(user1.password,form1.password.data): login_user(user1) return redirect('/home') else: return '密码错误' else: return '用户名不存在' return render_template("login.html",form=form1)
2. 复用校验逻辑:自定义匿名访问装饰器
如果后续有多个公开路由需要相同校验,可以写一个@anonymous_required装饰器,避免重复编写判断逻辑:
from functools import wraps def anonymous_required(f): @wraps(f) def decorated_function(*args, **kwargs): if current_user.is_authenticated: # 已登录用户直接跳转到内部首页 return redirect(url_for('home1')) return f(*args, **kwargs) return decorated_function
使用时直接给公开路由加装饰器即可,原有路由逻辑无需修改:
@app.route('/',methods=['POST','GET']) @anonymous_required def home(): # 原有注册逻辑无需改动 ... @app.route('/login',methods=['POST','GET']) @anonymous_required def login(): # 原有登录逻辑无需改动 ...
3. 现有代码的其他优化点
- 你的
register.html里密码错误提示遍历的是form.name.errors,属于笔误,改为form.password.errors才能正确显示密码的校验错误 db.create_all()建议放在应用上下文内执行,避免新版本Flask报错:with app.app_context(): db.create_all()- 不用指定
generate_password_hash的method='sha256',新版本Werkzeug默认使用更安全的哈希算法,手动指定旧算法反而会降低安全性。
内容的提问来源于stack exchange,提问作者user17521786
相关产品推荐
相关产品推荐

