Flask应用重定向后保持管理员登录并返回原页面的问题
问题解决步骤
1. 修正路由结构(拆分列表展示与更新操作)
原路由将管理员用户列表展示和单个用户状态更新合并,导致URL逻辑混乱。拆分后职责更清晰:
from flask import Flask, request, redirect, url_for, flash, render_template, session from bson.objectid import ObjectId # 管理员专属用户列表页 @app.route("/edit_users/admin", methods=["GET"]) def admin_users_list(): # 验证当前用户是否为管理员(结合你的登录session逻辑调整) if session.get("is_superuser") != "on": flash("无访问权限") return redirect(url_for("home")) # 替换为你的首页/登录页路由 users = list(mongo.db.users.find()) return render_template("edit_users.html", users=users) # 单个用户超级用户状态更新接口 @app.route("/edit_users/update/<user_id>", methods=["POST"]) def update_user_superuser(user_id): is_superuser = "on" if request.form.get("is_superuser") else "off" mongo.db.users.update_one( {"_id": ObjectId(user_id)}, {"$set": {"is_superuser": is_superuser}} ) flash("用户状态已更新") # 重定向回管理员用户列表页 return redirect(url_for("admin_users_list"))
2. 修复HTML模板中的表单错误
原表单存在两个核心问题:错误使用列表对象users而非单个用户user生成URL,以及指向了错误的路由。修正后:
{% extends "base.html" %} {% block content %} <div class="container-fluid"> <div class="row mb-5"> <div class="col text-center"> <h1 class="mb-5">Users List</h1> <div class="card w-50 mx-auto border-0 rounded-0"> <ul class="list-group list-group-flush "> {% for user in users %} <li class="list-group-item d-inline-flex justify-content-between border-3 border-color-1 rounded-0 mb-1"> <h4><i class="fa-solid fa-user"></i> {{ user.username|upper}}</h4> <!-- 修正action指向更新路由,使用单个用户的_id --> <form method="POST" action="{{ url_for('update_user_superuser', user_id=user._id) }}"> <div class="form-check form-switch"> {% if user.is_superuser == "on" %} <input class="form-check-input" type="checkbox" role="switch" id="is_superuser_{{ user._id }}" name="is_superuser" checked> {% else %} <input class="form-check-input" type="checkbox" role="switch" id="is_superuser_{{ user._id }}" name="is_superuser"> {% endif %} <label class="form-check-label" for="is_superuser_{{ user._id }}">Superuser</label> <button type="submit" class="btn btn-primary">Apply</button> </div> </form> </li> {% endfor %} </ul> </div> </div> </div> </div> {% endblock %}
注:给checkbox的id添加user._id后缀,避免循环中id重复导致的交互异常
3. 管理员登录状态保持说明
- 管理员身份验证依赖session(或你使用的登录机制),只要session中的
is_superuser状态有效,访问/edit_users/admin就会被允许。 - 重定向时使用
url_for("admin_users_list")直接指向管理员列表页路由,既不会丢失URL中的admin标识,也能确保只有管理员可访问该页面。
原问题根源分析
- 路由设计混淆了「管理员列表页」和「单个用户更新页」的逻辑,导致URL中的
admin被当作user_id传入,与数据库中ObjectId格式的用户ID冲突。 - HTML模板中表单
action错误使用列表对象users而非单个用户user,生成的URL无效。 - 重定向使用
request.referrer或request.url无法保证回到正确的管理员列表页,因为提交表单时的URL是单个用户的更新地址。
内容的提问来源于stack exchange,提问作者Abby Humphreys
相关产品推荐
相关产品推荐

